web-dev-qa-db-fra.com

C # convertir csv en xls (en utilisant le fichier csv existant)

je crois que nous avons beaucoup de discussions sur cette question. mais j'ai lu tous les articles et j'essaye mais ça ne marche jamais avec c #. mon objectif est simple que j'ai un fichier csv existant. je veux juste convertir le fichier exel et c'est fait. beaucoup de gens ont dit que l'utilisation de spire.xls était quelque chose mais je pense que MS .office.interop.Excel pourrait le gérer.

Conversion du fichier Excel de .csv en .xlsx

j'ai lu le problème ci-dessus et c'est le même que mon problème. mais le code ci-dessus ne fonctionne pas sur mon PC .. dois-je importer d'autres DLL pour l'utiliser. je copie juste le code de ce site. recopiez ci-dessous ...

actuellement, j'utilise Lib comme MS.office.interop.Excel et MS.office.interop.core

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

voici beaucoup d'erreur. modifier le code est ci-dessous et maintenant je n'utilise que MS.office.interop.Excel et MS.office.interop.core dans ma référence. il semble que je doive utiliser un autre fichier dll. de toute façon j'ai suivi ce code et fait un nouveau code. cela réduit les erreurs mais je ne sais pas que c'est la bonne approche. ci-dessous est ce que j'ai essayé maintenant.

        Excel.Application xlApp;
        Excel.Workbook xlWorkBook;
        Excel.Worksheet xlWorkSheet;
        object misValue = System.Reflection.Missing.Value;

        System.Globalization.CultureInfo oldCI = System.Threading.Thread.CurrentThread.CurrentCulture;
        System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");

        xlApp = new Excel.ApplicationClass();
        xlWorkBook = xlApp.Workbooks.Add(misValue);

        xlWorkBook = xlApp.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);
        xlWorkBook.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);
        xlWorkBook.Close(); 

et voici un message d'erreur

   //  Error     3  The name 'XlFileFormat' does not exist in the current context   C:\Users\jochoi\Desktop\joseph_BT_전류_code\DC_Test - ver01\DC_Test\DC.cs 528 54  DC_Test
   //   Error   4   The name 'XlSaveAsAccessMode' does not exist in the current context C:\Users\jochoi\Desktop\joseph_BT_전류_code\DC_Test - ver01\DC_Test\DC.cs 528 142 DC_Test
   //   Error   4   No overload for method 'Close' takes '0' arguments  C:\Users\jochoi\Desktop\joseph_BT_전류_code\DC_Test - ver01\DC_Test\DC.cs 525 13  DC_Test

mon objectif est simplement de saisir le fichier csv existant et de le changer en fichier Excel. est-ce que quelqu'un a une autre solution parce que cette réponse ne fonctionne pas sur mon PC. (c #)

12
Choi Joseph

COM Interop n'est pas la meilleure solution, surtout si vous prévoyez d'exécuter votre code dans un environnement serveur .

Microsoft ne recommande pas actuellement et ne prend pas en charge l'automatisation des applications Microsoft Office à partir de toute application ou composant client sans assistance non interactif (y compris les services ASP, ASP.NET, DCOM et NT), car Office peut présenter un comportement instable et/ou blocage lorsque Office est exécuté dans cet environnement.

Une autre approche consiste à utiliser des composants adaptés à cet effet.
J'ai utilisé EEplus et il fait son sale boulot. Il possède une licence LGPL mais l'auteur ne semble pas être inquiet à propos de votre utilisation dans votre produit commercial.

Installez simplement le paquet nuget:

Install-Package EPPlus

et utilisez ce code:

using System.IO;
using OfficeOpenXml;

class Program
{
    static void Main(string[] args)
    {
        string csvFileName = @"FL_insurance_sample.csv";
        string excelFileName = @"FL_insurance_sample.xls";

        string worksheetsName = "TEST";

        bool firstRowIsHeader = false;

        var format = new ExcelTextFormat();
        format.Delimiter = ',';
        format.EOL = "\r";              // DEFAULT IS "\r\n";
        // format.TextQualifier = '"';

        using (ExcelPackage package = new ExcelPackage(new FileInfo(excelFileName)))
        {
            ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(worksheetsName);
            worksheet.Cells["A1"].LoadFromText(new FileInfo(csvFileName), format, OfficeOpenXml.Table.TableStyles.Medium27, firstRowIsHeader);
            package.Save();
        }

        Console.WriteLine("Finished!");
        Console.ReadLine();
    }
}

Vous pouvez configurer la structure de votre CVS en utilisant ExcelTextFormat.

Je l'ai testé avec des données tirées de ici .

D'autres exemples peuvent être trouvés ici .

MISE À JOUR:

Une autre option consiste à lire le fichier CSV vous-même sous forme de fichier texte:

private IEnumerable<string[]> ReadCsv(string fileName, char delimiter = ';')
{
    var lines = System.IO.File.ReadAllLines(fileName, Encoding.UTF8).Select(a => a.Split(delimiter));
    return (lines);
}

et utiliser d'autres projets open-source tels que NPOI ou ClosedXML . [~ # ~] npoi [~ # ~] et ClosedXML ne peut pas lire [~ # ~] csv [~ # ~] et faire la conversion mais en utilisant la fonction ReadCsv vous pouvez le faire vous-même.

Ces deux projets ont des licences permissives.

Conversion NPOI:

private static bool ConvertWithNPOI(string excelFileName, string worksheetName, IEnumerable<string[]> csvLines)
{
    if (csvLines == null || csvLines.Count() == 0)
    {
    return (false);
    }

    int rowCount = 0;
    int colCount = 0;

    IWorkbook workbook = new XSSFWorkbook();
    ISheet worksheet = workbook.CreateSheet(worksheetName);

    foreach (var line in csvLines)
    {
    IRow row = worksheet.CreateRow(rowCount);

    colCount = 0;
    foreach (var col in line)
    {
        row.CreateCell(colCount).SetCellValue(TypeConverter.TryConvert(col));
        colCount++;
    }
    rowCount++;
    }

    using (FileStream fileWriter = File.Create(excelFileName))
    {
       workbook.Write(fileWriter);
       fileWriter.Close();
    }

    worksheet = null;
    workbook = null;

    return (true);
}

Conversion ClosedXML:

private static bool ConvertWithClosedXml(string excelFileName, string worksheetName, IEnumerable<string[]> csvLines)
{
    if (csvLines == null || csvLines.Count() == 0)
    {
    return (false);
    }

    int rowCount = 0;
    int colCount = 0;

    using (var workbook = new XLWorkbook())
    {
    using (var worksheet = workbook.Worksheets.Add(worksheetName))
    {
        rowCount = 1;
        foreach (var line in csvLines)
        {
        colCount = 1;
        foreach (var col in line)
        {
            worksheet.Cell(rowCount, colCount).Value = TypeConverter.TryConvert(col);
            colCount++;
        }
        rowCount++;
        }

    }
    workbook.SaveAs(excelFileName);
    }

    return (true);
}

Si quelqu'un est intéressé, il y a un exemple de projet sur github avec un test de performances comparant les trois produits.

41
LeftyX