2010-03-29 7 views

Antwort

21

Kasse der .SaveAs() Methode in Excel-Objekt in CSV.

wbWorkbook.SaveAs("c:\yourdesiredFilename.csv", Microsoft.Office.Interop.Excel.XlFileFormat.xlCSV) 

Oder folgende:

public static void SaveAs() 
{ 
    Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.ApplicationClass(); 
    Microsoft.Office.Interop.Excel.Workbook wbWorkbook = app.Workbooks.Add(Type.Missing); 
    Microsoft.Office.Interop.Excel.Sheets wsSheet = wbWorkbook.Worksheets; 
    Microsoft.Office.Interop.Excel.Worksheet CurSheet = (Microsoft.Office.Interop.Excel.Worksheet)wsSheet[1]; 

    Microsoft.Office.Interop.Excel.Range thisCell = (Microsoft.Office.Interop.Excel.Range)CurSheet.Cells[1, 1]; 

    thisCell.Value2 = "This is a test."; 

    wbWorkbook.SaveAs(@"c:\one.xls", Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlShared, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); 
    wbWorkbook.SaveAs(@"c:\two.csv", Microsoft.Office.Interop.Excel.XlFileFormat.xlCSVWindows, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlShared, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); 

    wbWorkbook.Close(false, "", true); 
} 
+1

danken der für die Hilfe, aber wie kann ich eine vorhandene Datei konvertieren? – Gold

+0

Falls Sie sich noch nicht gefragt haben, müssen Sie zuerst die vorhandene Datei als Arbeitsmappe öffnen, indem Sie die Excel.Application.Workbooks.Open() Methode verwenden und diese als wbWorkbook Parameter – markdigi

+1

mit xlSaveAsAccessMode.xlNoChange ist zuverlässiger (der Aufruf Save As stürzt in meinem Fall ab, wenn ich xlShared verwende). – Benlitz

22

Hier ist eine C# Methode, dies zu tun. Denken Sie daran, Ihre eigene Fehlerbehandlung hinzuzufügen - dies setzt meistens voraus, dass die Dinge der Kürze halber funktionieren. Es ist nur 4.0+ Framework, aber das ist vor allem wegen der optionalen worksheetNumber Parameter. Sie können die Methode überlasten, wenn Sie frühere Versionen unterstützen müssen.

static void ConvertExcelToCsv(string excelFilePath, string csvOutputFile, int worksheetNumber = 1) { 
    if (!File.Exists(excelFilePath)) throw new FileNotFoundException(excelFilePath); 
    if (File.Exists(csvOutputFile)) throw new ArgumentException("File exists: " + csvOutputFile); 

    // connection string 
    var cnnStr = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\"Excel 8.0;IMEX=1;HDR=NO\"", excelFilePath); 
    var cnn = new OleDbConnection(cnnStr); 

    // get schema, then data 
    var dt = new DataTable(); 
    try { 
     cnn.Open(); 
     var schemaTable = cnn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 
     if (schemaTable.Rows.Count < worksheetNumber) throw new ArgumentException("The worksheet number provided cannot be found in the spreadsheet"); 
     string worksheet = schemaTable.Rows[worksheetNumber - 1]["table_name"].ToString().Replace("'", ""); 
     string sql = String.Format("select * from [{0}]", worksheet); 
     var da = new OleDbDataAdapter(sql, cnn); 
     da.Fill(dt); 
    } 
    catch (Exception e) { 
     // ??? 
     throw e; 
    } 
    finally { 
     // free resources 
     cnn.Close(); 
    } 

    // write out CSV data 
    using (var wtr = new StreamWriter(csvOutputFile)) { 
     foreach (DataRow row in dt.Rows) { 
     bool firstLine = true; 
     foreach (DataColumn col in dt.Columns) { 
      if (!firstLine) { wtr.Write(","); } else { firstLine = false; } 
      var data = row[col.ColumnName].ToString().Replace("\"", "\"\""); 
      wtr.Write(String.Format("\"{0}\"", data)); 
     } 
     wtr.WriteLine(); 
     } 
    } 
} 
+0

zu schließen, um diese zu schließen. Dies funktionierte für mich mit einer XLSM-Datei. Vielen Dank! –

0

Ich muss das gleiche tun. Ich landete mit etwas ähnlichem

 static void ExcelToCSVCoversion(string sourceFile, string targetFile) 
    { 
     Application rawData = new Application(); 

     try 
     { 
      Workbook workbook = rawData.Workbooks.Open(sourceFile); 
      Worksheet ws = (Worksheet) workbook.Sheets[1]; 
      ws.SaveAs(targetFile, XlFileFormat.xlCSV); 
      Marshal.ReleaseComObject(ws); 
     } 

     finally 
     { 
      rawData.DisplayAlerts = false; 
      rawData.Quit(); 
      Marshal.ReleaseComObject(rawData); 
     } 


     Console.WriteLine(); 
     Console.WriteLine($"The excel file {sourceFile} has been converted into {targetFile} (CSV format)."); 
     Console.WriteLine(); 
    } 

KMAN Wenn mehrere Blätter dies bei der Umwandlung verloren, aber man konnte eine Schleife über die Anzahl der Blätter und jeden als csv speichern.

0

Installieren Sie diese 2 Pakete

<packages> 
    <package id="ExcelDataReader" version="3.3.0" targetFramework="net451" /> 
    <package id="ExcelDataReader.DataSet" version="3.3.0" targetFramework="net451" /> 
</packages> 

Helper Funktion

using ExcelDataReader; 
using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ExcelToCsv 
{ 
    public class ExcelFileHelper 
    { 
     public static bool SaveAsCsv(string excelFilePath, string destinationCsvFilePath) 
     { 

      using (var stream = new FileStream(excelFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
      { 
       IExcelDataReader reader = null; 
       if (excelFilePath.EndsWith(".xls")) 
       { 
        reader = ExcelReaderFactory.CreateBinaryReader(stream); 
       } 
       else if (excelFilePath.EndsWith(".xlsx")) 
       { 
        reader = ExcelReaderFactory.CreateOpenXmlReader(stream); 
       } 

       if (reader == null) 
        return false; 

       var ds = reader.AsDataSet(new ExcelDataSetConfiguration() 
       { 
        ConfigureDataTable = (tableReader) => new ExcelDataTableConfiguration() 
        { 
         UseHeaderRow = false 
        } 
       }); 

       var csvContent = string.Empty; 
       int row_no = 0; 
       while (row_no < ds.Tables[0].Rows.Count) 
       { 
        var arr = new List<string>(); 
        for (int i = 0; i < ds.Tables[0].Columns.Count; i++) 
        { 
         arr.Add(ds.Tables[0].Rows[row_no][i].ToString()); 
        } 
        row_no++; 
        csvContent += string.Join(",", arr) + "\n"; 
       } 
       StreamWriter csv = new StreamWriter(destinationCsvFilePath, false); 
       csv.Write(csvContent); 
       csv.Close(); 
       return true; 
      } 
     } 
    } 
} 

Verbrauch:

var excelFilePath = Console.ReadLine(); 
string output = Path.ChangeExtension(excelFilePath, ".csv"); 
ExcelFileHelper.SaveAsCsv(excelFilePath, output); 
Verwandte Themen