Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Excel文件从.csv转换为.xlsx_Csv_C#_Winforms - Fatal编程技术网

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

将Excel文件从.csv转换为.xlsx,csv,c#,winforms,Csv,C#,Winforms,我希望我的应用程序找到一个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文件,并将其转换为.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拒绝打开它,当我尝试进一步冒险时,我的应用程序也不会打开它


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

我会在CSV文件中进行解析,并用它写出一个Excel文件:

我建议使用OpenXMLSDK的包装器。看看他们的例子。创建.xlsx文件非常容易。

我建议使用以下技术:

  • 这非常容易读取CSV文件,而且非常健壮
  • 通过kbcsv扩展从csv创建数据表
  • 使用eppplus库及其LoadFromDataTable创建有效的xlsx文件()
  • 完成了 优点:

    • 它比excel互操作更快
    • KBCSV比csv读取方法更健壮
    • 它在没有办公室的环境中可用

    对于希望使用互操作而不是外部库的用户,您只需执行以下操作:

    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();
    
    工作簿.SaveAs的第二个参数确定文件的真实格式。您应该使文件扩展名与该格式匹配,以便Excel不会抱怨损坏。您可以在MSDN上看到类型列表及其含义

    如往常一样,如果此功能用于服务器环境,请牢记Microsoft的注意事项。在这种情况下,互操作可能不是解决问题的方法:


    此代码应打开所需文件,并将其保存为不损坏文件的格式

  • 重命名文件
  • 创建Excel.Application实例
  • 打开文件
  • 是否将另存为所需格式
  • 关闭它

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

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

    示例:

    • convertToExcel(@“文件路径”、“\t”、“.csv”)
    • convertToExcel(@“文件路径”、“\\”、“.txt”)

      publicstaticvoidconverttoexcel(字符串文件名、字符串拆分器、字符串扩展名)
      {
      字符串newFileName=fileName.Replace(“.”扩展名“.xls”);
      string[]lines=File.ReadAllLines(文件名,Encoding.UTF8);
      int columnCounter=0;
      foreach(行中的字符串s)
      {
      字符串[]ss=s.Trim().Split(Convert.ToChar(splitter));
      如果(ss.Length>columnCounter)
      columnCounter=ss.长度;
      }           
      HSSFWorkbook=新的HSSFWorkbook();
      var sheet=workbook.CreateSheet(“数据”);
      var-rowIndex=0;
      var rowExcel=sheet.CreateRow(rowIndex);
      foreach(行中的字符串s)
      {
      rowExcel=sheet.CreateRow(rowIndex);
      字符串[]ss=s.Trim().Split(Convert.ToChar(splitter));
      对于(int i=0;i

    您无法通过直接更改文件扩展名来完成此操作。尝试使用任何第三方dll。我可以打开该文件并将其另存为新格式吗?可能吗?是的,打开它并保存为新格式将起作用。应该可以使用Excel VBA宏来执行此操作,如果这有帮助,您需要使用Microsoft提供的类似的工具来执行此操作。但是,除非您计划添加一些附加功能(嵌入公式、字体、颜色、图表等),否则您只需坚持使用CSV文件,因为Excel会很高兴地打开它。您可以使用EPPlus或NPOI来编写本机XLSX文件。其次,EPPlus是一个很棒的工具,刚刚测试过它,它与Office 2013配合得非常好,谢谢!还想在.NET4中添加一点,您可以跳过所有那些讨厌的Type.Missing。您只需调用:Workbook wb=app.Workbooks.Open(csvPath);SaveAs(xlsxPath,XlFileFormat.xlOpenXMLWorkbook,AccessMode:XlSaveAsAccessMode.xlExclusive)@kDar-您的代码以密码保护模式保存文件。如果已存在同名文件,如何在不向用户显示提示的情况下覆盖该文件?@Si8
    app.DisplayAlerts=false在保存之前。记住在之后将其设置为true!(app是应用程序的名称,
    Application app=new Application();
    )感谢您的回复@DDuffy。。。在浏览了API之后,我终于找到了答案。感谢您的帮助。EPPLus可以通过LoadFromText方法直接加载CSV:-)var range=sheet.Cells[“A1”]。LoadFromText(新文件信息(CSV_文件路径),格式,TableStyles.Medium27,true);这是完整的例子,你能解释一下你的答案吗?仅使用代码的答案通常是不可接受的,因为它们不一定能帮助询问者从错误中吸取教训,等等。xlExcel5的+1-因为当您打开excel文件时,它不会给出内部数据是其他格式的消息。它也适用于
    \u工作簿[1].SaveAs(“testcsv.xlsx”,excel.XlFileFormat.xlWorkbookDefault)但需要将csv文件重命名为xls。
    
    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();
        }
    }