データが入ったExcelファイルがあります。コードで作成した別のExcelファイルに、特定の行を書き込みたいと思います。ところで、これらの行のインデックスはリストにあります。どうやってやるの?
MSはOpenXML SDK V 2.5を提供しています- https://msdn.Microsoft.com/en-us/library/bb448854(v = office.15).aspx を参照してください
これにより、MS Officeファイル(Excelを含む)の読み取りと書き込みが可能になります...
別のオプションを参照してください http://www.codeproject.com/KB/office/OpenXML.aspx
レンダリングや数式などが必要な場合は、AsposeやFlexcelなどのさまざまな商用ライブラリがあります。
private void button1_Click(object sender, EventArgs e)
{
Excel.Application xlApp ;
Excel.Workbook xlWorkBook ;
Excel.Worksheet xlWorkSheet ;
object misValue = System.Reflection.Missing.Value;
xlApp = new Excel.ApplicationClass();
xlWorkBook = xlApp.Workbooks.Add(misValue);
xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
xlWorkSheet.Cells[1, 1] = "http://csharp.net-informations.com";
xlWorkBook.SaveAs("csharp-Excel.xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
xlWorkBook.Close(true, misValue, misValue);
xlApp.Quit();
releaseObject(xlWorkSheet);
releaseObject(xlWorkBook);
releaseObject(xlApp);
MessageBox.Show("Excel file created , you can find the file c:\\csharp-Excel.xls");
}
private void releaseObject(object obj)
{
try
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
obj = null;
}
catch (Exception ex)
{
obj = null;
MessageBox.Show("Exception Occured while releasing object " + ex.ToString());
}
finally
{
GC.Collect();
}
}
上記のコードは直接オフになっています csharp.net サイトをご覧ください。
interopを使用してExcelを開き、データが完了したら列幅を変更しました。 interopを使用してデータを新しいExcelブックに吐き出す場合(これが必要な場合)、非常に遅くなります。代わりに、[〜#〜] csv [〜#〜]を生成してから、ExcelでCSVを開きました。これには独自の問題がありますが、これが最も簡単な方法であることがわかりました。
まず、CSVを変換します。
// Convert array data into CSV format.
// Modified from http://csharphelper.com/blog/2018/04/write-a-csv-file-from-an-array-in-c/.
private string GetCSV(List<string> Headers, List<List<double>> Data)
{
// Get the bounds.
var rows = Data[0].Count;
var cols = Data.Count;
var row = 0;
// Convert the array into a CSV string.
StringBuilder sb = new StringBuilder();
// Add the first field in this row.
sb.Append(Headers[0]);
// Add the other fields in this row separated by commas.
for (int col = 1; col < cols; col++)
sb.Append("," + Headers[col]);
// Move to the next line.
sb.AppendLine();
for (row = 0; row < rows; row++)
{
// Add the first field in this row.
sb.Append(Data[0][row]);
// Add the other fields in this row separated by commas.
for (int col = 1; col < cols; col++)
sb.Append("," + Data[col][row]);
// Move to the next line.
sb.AppendLine();
}
// Return the CSV format string.
return sb.ToString();
}
次に、Excelにエクスポートします!
public void ExportToExcel()
{
// Initialize app and pop Excel on the screen.
var excelApp = new Excel.Application
{
Visible = true
};
// I use unix time to give the files a unique name that's almost somewhat useful.
DateTime dateTime = DateTime.UtcNow;
long unixTime = ((DateTimeOffset)dateTime).ToUnixTimeSeconds();
var path = @"C:\Users\my\path\here + unixTime + ".csv";
var csv = GetCSV();
File.WriteAllText(path, csv);
// Create a new workbook and get its active sheet.
excelApp.Workbooks.Open(path);
var workSheet = (Excel.Worksheet)excelApp.ActiveSheet;
// iterrate through each value and throw it in the chart
for (var column = 0; column < Data.Count; column++)
{
((Excel.Range)workSheet.Columns[column + 1]).AutoFit();
}
currentSheet = workSheet;
}
また、いくつかのものをインストールする必要があります...
私が何かを忘れた場合、ここに私の「使用する」ステートメントがあります:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using Excel = Microsoft.Office.Interop.Excel;
また、C#を使用してExcelスプレッドシートにデータをエクスポートする際の同様の問題に苦労していました。外部DLLを操作するさまざまな方法を試しましたが、運がありませんでした。
エクスポート機能については、外部DLLを扱うものを使用する必要はありません。代わりに、応答のヘッダーとコンテンツタイプを維持するだけです。
ここに私がかなり役立つと思う記事があります。この記事では、ASP.NETを使用してデータをExcelスプレッドシートにエクスポートする方法について説明しています。
http://www.icodefor.net/2016/07/export-data-to-Excel-sheet-in-asp-dot-net-c-sharp.html