23

我希望我的应用程序能够找到一个 excel 文件并将其转换为 .xlsx 文件。

这是我目前正在做的事情;

var fileName = @"Z:\0328\orders\PurchaseOrder.csv";
FileInfo f = new FileInfo(fileName);
f.MoveTo(Path.ChangeExtension(fileName, ".xlsx"));
var Newfile = @"Z:\0328\orders\PurchaseOrder.xlsx";

现在这确实有效。它将文件扩展名更改为我想要的格式。但是,该文件随后变得“损坏”,或者至少 Excel 拒绝打开它,当我尝试进一步冒险时,我的应用程序也不会打开它。

有没有人有解决方案/解决方法?

4

6 回答 6

17

对于那些想要使用 Interop 而不是外部库的人,您可以简单地执行以下操作:

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();

Workbook.SaveAs 的第二个参数确定文件的真实格式。您应该使文件扩展名与该格式匹配,以便 Excel 不会抱怨损坏。您可以在 MSDN 上查看类型列表及其含义。

http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.xlfileformat.aspx

与往常一样,如果此功能适用于服务器环境,请牢记 Microsoft 的注意事项。在这种情况下,互操作可能不是要走的路:

http://support.microsoft.com/kb/257757

于 2014-01-22T16:29:41.120 回答
13

我会解析 CSV 文件并使用它来写出一个 Excel 文件:https ://github.com/JanKallman/EPPlus

于 2013-05-24T10:07:11.000 回答
7

此代码应打开您想要的文件并将其保存为格式而不会损坏它。

  1. 重命名文件
  2. 创建 Excel.Application 实例
  3. 打开文件
  4. 是否保存为所需的格式
  5. 关闭它

    using Excel = Microsoft.Office.Interop.Excel;
    
    private void Convert_CSV_To_Excel()
    {
    
        // Rename .csv To .xls
        System.IO.File.Move(@"d:\Test.csv", @"d:\Test.csv.xls");
    
        var _app = new Excel.Application();
        var _workbooks = _app.Workbooks;
    
        _workbooks.OpenText("Test.csv.xls",
                                 DataType: Excel.XlTextParsingType.xlDelimited,
                                 TextQualifier: Excel.XlTextQualifier.xlTextQualifierNone,
                                 ConsecutiveDelimiter: true,
                                 Semicolon: true);
    
        // Convert To Excle 97 / 2003
        _workbooks[1].SaveAs("NewTest.xls", Excel.XlFileFormat.xlExcel5);
    
        _workbooks.Close();
    }
    
于 2015-05-13T10:07:49.933 回答
2

我建议使用以下技术:

  1. http://kbcsv.codeplex.com/这很容易读取 CSV 文件并且非常健壮。
  2. 通过 kbcsv 扩展从 csv 创建一个数据表。
  3. 使用 eppplus 库及其 LoadFromDataTable 创建一个有效的 xlsx 文件 ( https://github.com/JanKallman/EPPlus )
  4. 完毕!

好处:

  • 它比 excel 互操作更快
  • KBCSV 比 csv 读取方法更强大。
  • 它在没有办公室的环境中可用。
于 2013-05-24T10:41:13.370 回答
1

试试这门课;接收带有任何分隔符(包括制表符)的任何 CSV 或 TXT 文件并转换为 Excel (.xls)

例子:

  • convertToExcel(@"文件路径", "\t", ".csv");
  • convertToExcel(@"文件路径", "\|", ".txt");

    public static void convertToExcel(string fileName, string splitter, string extension)
    {
        string newFileName = fileName.Replace("." + extension, ".xls");
    
        string[] lines = File.ReadAllLines(fileName, Encoding.UTF8);
    
        int columnCounter = 0;
    
        foreach (string s in lines)
        {
            string[] ss = s.Trim().Split(Convert.ToChar(splitter));
    
            if (ss.Length > columnCounter)
                columnCounter = ss.Length;
        }           
    
        HSSFWorkbook workbook = new HSSFWorkbook();
        var sheet = workbook.CreateSheet("Data");
        var rowIndex = 0;
        var rowExcel = sheet.CreateRow(rowIndex);
    
        foreach (string s in lines)
        {
            rowExcel = sheet.CreateRow(rowIndex);
    
            string[] ss = s.Trim().Split(Convert.ToChar(splitter));
    
            for (int i = 0; i < columnCounter; i++)
            {
                string data = !String.IsNullOrEmpty("s") && i < ss.Length ? ss[i] : "";
                rowExcel.CreateCell(i).SetCellType(CellType.String);
                rowExcel.CreateCell(i).SetCellValue(data);                    
            }
    
            rowIndex++;
        }
    
        for (var i = 0; i < sheet.GetRow(0).LastCellNum; i++)
            sheet.AutoSizeColumn(i);
    
        using (FileStream file = new FileStream(newFileName, FileMode.Create, FileAccess.Write))
        {
            workbook.Write(file);
            file.Close();
        }
    }
    
于 2018-08-15T18:07:28.487 回答
0

我会推荐Closed XML,它是 Open XML SDK 的包装器。看看他们的例子。创建 .xlsx 文件非常容易。

于 2013-05-24T10:13:05.177 回答