私はここでこの問題について多くの議論があると信じています。しかし、私はすべての投稿を読んで試してみますが、C#では動作しません。私の目標は、既存のcsvファイルがあることです。 exelファイルを変換して完了したいだけです。多くの人が、spire.xlsを使用すると何か言いましたが、MS .office.interop.Excelで処理できると信じています。
上記の問題を読みましたが、これは私の問題と同じです。しかし、上記のコードは私のPCで動作しません。これを使用するために他のdllをインポートする必要がありますか。そのサイトからコードをコピーするだけです。下にもう一度コピーしてください...
現在、LibをMS.office.interop.ExcelおよびMS.office.interop.coreとして使用しています。
Application app = new Application();
Workbook wb = app.Workbooks.Open(@"C:\testcsv.csv", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
wb.SaveAs(@"C:\testcsv.xlsx", XlFileFormat.xlOpenXMLWorkbook, Type.Missing, Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
wb.Close();
app.Quit();
ここに多くのエラーがあります。変更コードは以下にありますが、現在は参照でMS.office.interop.ExcelとMS.office.interop.coreのみを使用しています。別のdllファイルを使用する必要があるようです。とにかく私はそのコードに従って新しいコードを作成しました。それはエラーを減らしますが、これが正しいアプローチであることは知りません。以下は私が今試したものです。
Excel.Application xlApp;
Excel.Workbook xlWorkBook;
Excel.Worksheet xlWorkSheet;
object misValue = System.Reflection.Missing.Value;
System.Globalization.CultureInfo oldCI = System.Threading.Thread.CurrentThread.CurrentCulture;
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
xlApp = new Excel.ApplicationClass();
xlWorkBook = xlApp.Workbooks.Add(misValue);
xlWorkBook = xlApp.Workbooks.Open(@"C:\testcsv.csv", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
xlWorkBook.SaveAs(@"C:\testcsv.xlsx", XlFileFormat.xlOpenXMLWorkbook, Type.Missing, Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
xlWorkBook.Close();
ここにエラーメッセージがあります
// Error 3 The name 'XlFileFormat' does not exist in the current context C:\Users\jochoi\Desktop\joseph_BT_전류_code\DC_Test - ver01\DC_Test\DC.cs 528 54 DC_Test
// Error 4 The name 'XlSaveAsAccessMode' does not exist in the current context C:\Users\jochoi\Desktop\joseph_BT_전류_code\DC_Test - ver01\DC_Test\DC.cs 528 142 DC_Test
// Error 4 No overload for method 'Close' takes '0' arguments C:\Users\jochoi\Desktop\joseph_BT_전류_code\DC_Test - ver01\DC_Test\DC.cs 525 13 DC_Test
私の目標は、既存のcsvファイルを取得し、Excelファイルに変更することです。その答えは私のPCでは動作しないため、誰かが他のソリューションを持っていますか? (c#)
特に、コードを サーバー環境 で実行する場合は、COM相互運用が最適なソリューションではありません。
Officeは不安定な動作を示したり、/この環境でOfficeを実行すると、デッドロックが発生します。
別のアプローチは、その目的に適したコンポーネントを使用することです。
私は EEplus を使用しましたが、これは汚い仕事です。 LGPLライセンスを持っていますが、著者は商用製品でそれを使用することについて 心配 をしているようには見えません。
Nugetパッケージをインストールするだけです:
Install-Package EPPlus
次のコードを使用します。
using System.IO;
using OfficeOpenXml;
class Program
{
static void Main(string[] args)
{
string csvFileName = @"FL_insurance_sample.csv";
string excelFileName = @"FL_insurance_sample.xls";
string worksheetsName = "TEST";
bool firstRowIsHeader = false;
var format = new ExcelTextFormat();
format.Delimiter = ',';
format.EOL = "\r"; // DEFAULT IS "\r\n";
// format.TextQualifier = '"';
using (ExcelPackage package = new ExcelPackage(new FileInfo(excelFileName)))
{
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(worksheetsName);
worksheet.Cells["A1"].LoadFromText(new FileInfo(csvFileName), format, OfficeOpenXml.Table.TableStyles.Medium27, firstRowIsHeader);
package.Save();
}
Console.WriteLine("Finished!");
Console.ReadLine();
}
}
ExcelTextFormat
を使用してCVSの構造を構成できます。
here から取得したいくつかのデータでテストしました。
さらにいくつかのサンプルを見つけることができます こちら 。
UPDATE:
別のオプションは、CSVファイルをテキストファイルとして自分で読み取ることです。
private IEnumerable<string[]> ReadCsv(string fileName, char delimiter = ';')
{
var lines = System.IO.File.ReadAllLines(fileName, Encoding.UTF8).Select(a => a.Split(delimiter));
return (lines);
}
[〜#〜] npoi [〜#〜] または ClosedXML などの他のオープンソースプロジェクトを使用します。 [〜#〜] npoi [〜#〜]およびClosedXMLはできません[〜#〜] csv [〜#〜]を読み取り、変換を行いますが、関数ReadCsv
を使用して自分で行うことができます。
これらのプロジェクトはいずれも許容ライセンスを持っています。
NPOI変換:
private static bool ConvertWithNPOI(string excelFileName, string worksheetName, IEnumerable<string[]> csvLines)
{
if (csvLines == null || csvLines.Count() == 0)
{
return (false);
}
int rowCount = 0;
int colCount = 0;
IWorkbook workbook = new XSSFWorkbook();
ISheet worksheet = workbook.CreateSheet(worksheetName);
foreach (var line in csvLines)
{
IRow row = worksheet.CreateRow(rowCount);
colCount = 0;
foreach (var col in line)
{
row.CreateCell(colCount).SetCellValue(TypeConverter.TryConvert(col));
colCount++;
}
rowCount++;
}
using (FileStream fileWriter = File.Create(excelFileName))
{
workbook.Write(fileWriter);
fileWriter.Close();
}
worksheet = null;
workbook = null;
return (true);
}
ClosedXML変換:
private static bool ConvertWithClosedXml(string excelFileName, string worksheetName, IEnumerable<string[]> csvLines)
{
if (csvLines == null || csvLines.Count() == 0)
{
return (false);
}
int rowCount = 0;
int colCount = 0;
using (var workbook = new XLWorkbook())
{
using (var worksheet = workbook.Worksheets.Add(worksheetName))
{
rowCount = 1;
foreach (var line in csvLines)
{
colCount = 1;
foreach (var col in line)
{
worksheet.Cell(rowCount, colCount).Value = TypeConverter.TryConvert(col);
colCount++;
}
rowCount++;
}
}
workbook.SaveAs(excelFileName);
}
return (true);
}
誰かが興味がある場合は、githubに サンプルプロジェクト があり、3つの製品を比較するパフォーマンスのテストがあります。