C # converte csv in xls (usando il file csv esistente)

Credo che qui ci sia molto da discutere su questo argomento. ma ho letto tutti i post e provo ma non funziona mai con c #. il mio objective è semplice che io abbia un file csv esistente. voglio solo convertire exel file e fatto. molte persone hanno detto che usando spire.xls qualcosa, ma credo che MS .office.interop.excel possa gestirlo.

Conversione di file Excel da .csv a .xlsx

Ho letto il problema precedente e questo è lo stesso del mio problema. ma sopra il codice non funziona nel mio PC .. ho bisogno di importare altre DLL per usare questo. Ho appena copiare il codice da quel sito. copia di nuovo sotto …

attualmente sto usando Lib come MS.office.interop.excel e 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(); 

qui ci sono molti errori. modifica codice è sotto e ora im solo utilizzando MS.office.interop.excel e MS.office.interop.core nel mio riferimento. sembra che ho bisogno di usare un altro file dll. comunque ho seguito quel codice e fatto un nuovo codice. riduce l’errore ma non so che questo è l’approccio corretto. di seguito è quello che ho provato ora.

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

e qui ci sono i messaggi di errore

  // 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 

il mio objective è solo afferrare il file csv e passare al file excel. qualcuno ha altra soluzione perché quella risposta non funziona sul mio pc. (C #)

COM Interop non è la soluzione migliore, soprattutto se si prevede di eseguire il codice in un ambiente server .

Microsoft al momento non consiglia, e non supporta, l’automazione delle applicazioni Microsoft Office da qualsiasi applicazione o componente client non interattivo non interattivo (inclusi ASP, ASP.NET, DCOM e NT Services), poiché Office potrebbe presentare un comportamento instabile e / o deadlock quando Office viene eseguito in questo ambiente.

Un altro approccio consiste nell’utilizzare componenti adatti a tale scopo.
Ho usato EEplus e lo fa è sporco. Ha una licenza LGPL ma l’autore non sembra preoccuparsi che tu lo usi nel tuo prodotto commerciale.

Basta installare il pacchetto nuget:

 Install-Package EPPlus 

e usa questo codice:

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

Puoi configurare la struttura del tuo CVS usando ExcelTextFormat .

L’ho provato con alcuni dati presi da qui .

Alcuni altri campioni possono essere trovati qui .

AGGIORNARE:

Un’altra opzione è leggere il file CSV come file di testo:

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

e utilizzare altri progetti open source come NPOI o ClosedXML . NPOI e ClosedXML non possono leggere CSV ed eseguire la conversione ma utilizzando la funzione ReadCsv puoi farlo da solo.

Entrambi questi progetti hanno licenze permissive.

Conversione NPOI:

 private static bool ConvertWithNPOI(string excelFileName, string worksheetName, IEnumerable 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); } 

Conversione ClosedXML:

 private static bool ConvertWithClosedXml(string excelFileName, string worksheetName, IEnumerable 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); } 

Se qualcuno è interessato, c’è un progetto di esempio su github con alcuni test per le prestazioni che mettono a confronto i tre prodotti.

Nella parte superiore del tuo file inserisci la seguente riga:

 using Microsoft.Office.Interop.Excel; 

Ciò includerà lo spazio dei nomi necessario per utilizzare le classi XlFileFormat e XlSaveAsAccessMode. Se questo non funziona potresti dover aggiungere un riferimento a questa DLL anche al tuo progetto.

Il metodo Close accetta i seguenti argomenti:

  1. Salva I Cambiamenti
  2. Nome del file
  3. RouteWorkbook

La documentazione per questo è qui .

Spero che sia d’aiuto.