2010-03-29 18 views

Respuesta

21

Pedido .SaveAs() el método de objeto de Excel.

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

O siguiente:

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

de agradecimiento de la ayuda, pero ¿cómo puedo convertir un archivo existente? – Gold

+0

En caso de que aún se lo esté preguntando, primero deberá abrir el archivo existente como un libro de trabajo utilizando el método Excel.Application.Workbooks.Open() y usarlo como el parámetro wbWorkbook – markdigi

+1

usando xlSaveAsAccessMode.xlNoChange es más confiable (la llamada para guardar colisiones en mi caso si uso xlShared). – Benlitz

22

Aquí es un método C# para hacer esto. Recuerde agregar su propio manejo de errores, esto en su mayoría supone que las cosas funcionan por el bien de la brevedad. Es solo el marco 4.0+, pero eso se debe principalmente al parámetro opcional worksheetNumber. Puede sobrecargar el método si necesita admitir versiones anteriores.

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

Esto funcionó para mí con un archivo XLSM. ¡Gracias! –

0

Necesito hacer lo mismo. Acabé con algo similar a Kman

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

Si hay varias hojas de esto se pierde en la conversión, pero se podía bucle sobre el número de hojas y guardar cada uno como CSV.

0

instalar estos 2 paquetes

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

Función de ayuda

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

Uso:

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