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

bmp9r5qi  于 2022-11-16  发布在  其他
关注(0)|答案(7)|浏览(200)

我想让我的应用程序找到一个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拒绝打开它,当我尝试进一步冒险时,我的应用程序也不会。
是否有人有解决方案/变通办法?

sqxo8psd

sqxo8psd1#

对于那些希望使用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

rqdpfwrv

rqdpfwrv2#

我将在CSV文件中进行解析,并使用此命令写出一个Excel文件:https://github.com/JanKallman/EPPlus

dfuffjeb

dfuffjeb3#

这段程式码应该会开启您要的档案,并将它储存成不会损毁的格式。
1.重命名文件
1.创建Excel.Application示例
1.开启档案
1.将保存为所需格式
1.关闭

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

abithluo4#

我建议使用以下技术:

  1. http://kbcsv.codeplex.com/这可以非常轻松地读取CSV文件,并且非常可靠。
    1.通过kbcsv扩展从csv创建数据表。
    1.使用eppplus库及其LoadFromDataTable创建有效的xlsx文件(https://github.com/JanKallman/EPPlus
    1.已完成!
    优点:
  • 它比excel interop更快。
  • KBCSV比excels csv阅读方法更稳健。
  • 在没有办公室的环境中也可以使用。
ekqde3dh

ekqde3dh5#

试试这个类;接受任何带有任何分隔符(包括制表符)的CSV或TXT文件,并转换为Excel(.xls)
实施例:

  • “文件路径”、“\t”、“.csv”;
  • “文件路径”、“|"、“.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();
    }
}
wlsrxk51

wlsrxk516#

我推荐Closed XML,它是一个OpenXMLSDK的 Package 器。看看他们的例子。创建一个.xlsx文件非常容易。

7eumitmz

7eumitmz7#

//small changes to the code provided by costsoldier

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

相关问题