web-dev-qa-db-ja.com

C#csvからxlsへの変換(既存のcsvファイルを使用)

私はここでこの問題について多くの議論があると信じています。しかし、私はすべての投稿を読んで試してみますが、C#では動作しません。私の目標は、既存のcsvファイルがあることです。 exelファイルを変換して完了したいだけです。多くの人が、spire.xlsを使用すると何か言いましたが、MS .office.interop.Excelで処理できると信じています。

。csvから.xlsxへの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#)

12
Choi Joseph

特に、コードを サーバー環境 で実行する場合は、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つの製品を比較するパフォーマンスのテストがあります。

41
LeftyX