2012-02-26 2 views
1

Я экспортирование Excel.Worksheet в C# как это:Сохранить Лист Excel в CSV с нулевым и точкой с запятой в качестве разделителя

myWorksheet.SaveAs(myPath, Excel.XlFileFormat.xlCSV); 

это работает почти нормально, но мне нужно, чтобы заставить две вещи:

  • «Полевой разделитель» должен быть точкой с запятой (;). Я получаю запятую (,)
  • «Текстовый разделитель» всегда должен быть нулевым. Я получаю двойные кавычки («»)

The documentation совершенно бесполезно (что ад «xlTextWindows:. Определяет тип формата текста» должен означать?)

Любая идея?

+1

Вы получаете запятую для своего разделителя полей, потому что это то, что означает «c» в CSV. Хотя я не знаком с длинным списком встроенных форматов Excel, я думаю, что, скорее всего, вы не найдете что-то, что точно соответствует вашим потребностям. Если это одноразовая операция, было бы довольно просто выполнить глобальный поиск и замену для выполнения этой задачи. Это что-то, что вам нужно будет делать многократно? Вы отметили это с помощью C# - вас интересует какой-то код на C# для выполнения последующей обработки и замены? – kmote

+0

'xlTextWindows' является одним из нескольких констант, которые определяют символ или символы новой строки. Windows использовала CR LF. В Excel, Save Workbook, поскольку CSV не помещает двойные кавычки вокруг текстового поля, если в нем нет запятой. Или C# отличается или у вас есть запятые в ваших полях. Я понимаю, что Excel будет использовать точку с запятой в качестве разделителя CSV, если десятичный разделитель указан как запятая. Обычно это национальный параметр, но C# имеет функциональность, позволяющую использовать временные национальные настройки, которые могут стоить попробовать. –

ответ

1

Спасибо, ребята, но я искал что-то немного менее неуклюжие.

Во всяком случае, так как я был всего лишь один шаг от закрытия проекта, я собрал безвкусный, но рабочий раствор так:

static public void WorksheetToCSV(Excel.Worksheet origine, string CSVoutPath, string fieldSeparator, string textSeparator) 
    { 
     Excel.Range rngCurrentRow; 
     string lineaDaScrivere; 
     TextWriter csv = new StreamWriter(CSVoutPath); 


     for (int i = 1; i <= origine.UsedRange.Rows.Count; i++) 
     { 
      rngCurrentRow = origine.UsedRange.get_Range("A" + i, "A" + i).EntireRow; 
      lineaDaScrivere=""; 

      foreach (Excel.Range cella in rngCurrentRow.Columns) 
      { 
       try 
       { 
        lineaDaScrivere = lineaDaScrivere + textSeparator + cella.Value.ToString() + textSeparator + fieldSeparator; 
       } 
       catch (NullReferenceException ex) 
       { 
        break; 
       } 
      } 
      lineaDaScrivere=lineaDaScrivere.Substring(0, (lineaDaScrivere.Length - fieldSeparator.Length)); 

      csv.WriteLine(lineaDaScrivere); 
     } 

     csv.Close(); 
    } 

Есть лучшее решение, но это работает, как ожидалось для меня.

+1

Не пишите свой собственный синтаксический анализатор/генератор CSV. Существуют [библиотеки] (http://www.filehelpers.com/), которые обрабатывают все перегибы для вас. В вашем случае: вы не избегаете своих символов, что может привести к некорректному выходу CSV. – Laoujin

1

Решение VBA (не C#), чтобы заменить запятые с запятой является:

Sub CreateCSV() 

Dim rCell As Range 
Dim rRow As Range 
Dim sOutput As String 
Dim sFname As String, lFnum As Long 

'Open a text file to write 
sFname = "C:\MyCsv.csv" 
lFnum = FreeFile 

Open sFname For Output As lFnum 
'Loop through the rows' 
    For Each rRow In ActiveSheet.UsedRange.Rows 
    'Loop through the cells in the rows' 
    For Each rCell In rRow.Cells 
     sOutput = sOutput & rCell.Value & ";" 
    Next rCell 
    'remove the last comma' 
    sOutput = Left(sOutput, Len(sOutput) - 1) 

    'write to the file and reinitialize the variables' 
    Print #lFnum, sOutput 
    sOutput = "" 
Next rRow 

'Close the file' 
Close lFnum 

End Sub 

source протестирована и работает. Теперь, я не уверен, какой разделитель текста вы говорите о том, что он "", но я не сталкивался с этим. Если вы пойдете по пути VBA, дайте мне знать, если это все еще происходит, и мы изменим код. Если это решение VBA вам совершенно бесполезно, я извиняюсь!

Смежные вопросы