将Excel文件从.csv转换为.xlsx

本文关键字:转换 xlsx csv Excel 文件 | 更新日期: 2023-09-27 18:15:04

我希望我的应用程序去找到一个csv 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拒绝打开它,当我试图进一步冒险时,我的应用程序也不会打开它。

有没有人有解决方案/工作?

将Excel文件从.csv转换为.xlsx

对于那些想要使用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();

工作簿的第二个参数。savea决定文件的真实格式。您应该使文件扩展名匹配该格式,以便Excel不会抱怨损坏。您可以在MSDN上看到类型列表及其含义。

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

如往常一样,如果此功能用于服务器环境,请牢记Microsoft的考虑因素。在这种情况下,互操作可能不是可行的方法: http://support.microsoft.com/kb/257757

我会在CSV文件中进行解析,并使用它来编写Excel文件:https://github.com/JanKallman/EPPlus

这段代码应该打开您想要的文件,并将其保存为不损坏的格式。

  1. 重命名文件
  2. 创建Excel。应用程序实例
  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();
    }
    

我建议使用以下技巧:

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

优势:

  • 比excel互操作更快
  • KBCSV比优秀的csv读取方法更健壮。
  • 可用于非办公环境

尝试这个类;接受任何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();
        }
    }
    

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

public static void ConvertFromCsvWithNpoi(string fileName, char splitter)
{
    var newFileName = Path.ChangeExtension(fileName, ".xlsx");
    string[] lines = File.ReadAllLines(fileName, Encoding.UTF8);
    IWorkbook workbook = new XSSFWorkbook();
    var sheet = workbook.CreateSheet(Path.GetFileName(newFileName));
    var rowIndex = 0;
    foreach (string line in lines)
    {
        var row = sheet.CreateRow(rowIndex);
        string[] lineStr = line.Trim().Split(splitter);
        for (int i = 0; i < lineStr.Length; i++)
        {
            string data = String.IsNullOrEmpty(line) ? string.Empty : lineStr[i].Trim();
            double sum = 0;
            if (double.TryParse(data, out sum))
            {
                row.CreateCell(i).SetCellValue(sum);
            }
            else
            {
                row.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();
    }
}