繁体   English   中英

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

[英]Converting Excel File From .csv To .xlsx

我希望我的应用程序为 go 并找到一个 excel 文件并将其转换为 a.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文件: https//github.com/JanKallman/EPPlus

对于那些想要使用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的注意事项。 在这种情况下,Interop可能不是那种方式:

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

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

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

我建议使用以下技术:

  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(@“path to file”,“\\ t”,“。csv”);
  • convertToExcel(@“path to file”,“\\ |”,“。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();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM