簡體   English   中英

C# 將 csv 轉換為 xls(使用現有的 csv 文件)

[英]C# convert csv to xls (using existing csv file)

我相信這里有很多關於這個問題的討論。 但我閱讀了所有帖子並嘗試過,但它永遠不會與 c# 一起工作。 我的目標很簡單,我有現有的 csv 文件。 只想轉換exel文件並完成。 許多人說使用 spire.xls 一些東西,但我相信 MS .office.interop.excel 可以處理它。

將 Excel 文件從 .csv 轉換為 .xlsx

我閱讀了上面的問題,這與我的問題相同。 但上面的代碼在我的電腦上不起作用..我是否需要導入其他 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(); 

這是錯誤信息

錯誤 3 當前上下文中不存在名稱 'XlFileFormat' C:\\Users\\jochoi\\Desktop\\joseph_BT_전류_code\\DC_Test - ver01\\DC_Test\\DC.cs 528 54 DC_Test
錯誤 4 當前上下文中不存在名稱“XlSaveAsAccessMode” C:\\Users\\jochoi\\Desktop\\joseph_BT_전류_code\\DC_Test - ver01\\DC_Test\\DC.cs 528 142 DC_Test
錯誤 4 方法“關閉”沒有重載需要“0”參數 C:\\Users\\jochoi\\Desktop\\joseph_BT_전류_code\\DC_Test - ver01\\DC_Test\\DC.cs 525 13 DC_Test

我的目標只是獲取現有的 csv 文件,然后更改為 excel 文件。 有沒有人有其他解決方案,因為該答案在我的電腦中不起作用。 (C#)

COM Interop 不是最佳解決方案,尤其是當您計划在服務器環境中運行代碼時。

Microsoft 當前不建議也不支持從任何無人參與的非交互式客戶端應用程序或組件(包括 ASP、ASP.NET、DCOM 和 NT 服務)自動化 Microsoft Office 應用程序,因為 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 的結構。

我已經用從這里獲取的一些數據對其進行了測試。

可以在此處找到更多示例。

更新:

另一種選擇是自己將 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);
}

並使用其他開源項目,例如NPOIClosedXML NPOIClosedXML無法讀取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 上有一個示例項目,其中包含一些比較三種產品的性能測試。

如果您想繼續使用 OpenXML,則可以按照此操作。

安裝nuget包

Install-Package DocumentFormat.OpenXml -Version 2.11.3

自己閱讀 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);
}

OpenXML 代碼:

private bool ConvertWithOpenXml(string excelFileName, string worksheetName, IEnumerable<string[]> csvLines)
        {
            if (csvLines == null || csvLines.Count() == 0)
            {
                return (false);
            }
            using (SpreadsheetDocument package = SpreadsheetDocument.Create(excelFileName, SpreadsheetDocumentType.Workbook, true))
            {
                package.AddWorkbookPart();
                package.WorkbookPart.Workbook = new Workbook();
                package.WorkbookPart.AddNewPart<WorksheetPart>();
                SheetData xlSheetData = new SheetData();
                foreach (var line in csvLines)
                {
                    Row xlRow = new Row();
                    foreach (var col in line)
                    {
                        Cell xlCell = new Cell(new InlineString(new Text(col.ToString()))) { DataType = CellValues.InlineString };
                        xlRow.Append(xlCell);
                    }
                    xlSheetData.Append(xlRow);
                }
                package.WorkbookPart.WorksheetParts.First().Worksheet = new Worksheet(xlSheetData);
                package.WorkbookPart.WorksheetParts.First().Worksheet.Save();

            
                // create the worksheet to workbook relation
                package.WorkbookPart.Workbook.AppendChild(new Sheets());
                package.WorkbookPart.Workbook.GetFirstChild<Sheets>().AppendChild(new Sheet()
                {
                    Id = package.WorkbookPart.GetIdOfPart(package.WorkbookPart.WorksheetParts.First()),

                    SheetId = 1,

                    Name = worksheetName

                });

                package.WorkbookPart.Workbook.Save();
            }
            return (true);
        }

在文件頂部插入以下行:

using Microsoft.Office.Interop.Excel;

這將包括使用 XlFileFormat 和 XlSaveAsAccessMode 類所需的命名空間。 如果這不起作用,您可能還需要將此 DLL 的引用添加到您的項目中。

Close 方法接受以下參數:

  1. 保存更改
  2. 文檔名稱
  3. 路線工作簿

相關文檔在這里

希望有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM