2012-02-26 104 views
1

我在C#中导出一个Excel.Worksheet这样的:保存Excel工作表为CSV具有零和分号作为分隔

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

其作品几乎确定,但我需要强制两件事情:

  • “字段分隔符”应该是分号(;)。我得到一个逗号(,)
  • “文本分隔符”应该始终为空。我越来越双引号(“”)

The documentation是完全无用的(这到底是“xlTextWindows:指定一个类型的文本格式的”什么意思?)

任何想法?

+1

因为这是CSV中的“c”代表的字段,因此您将获得逗号分隔符。虽然我不熟悉Excel内置格式的长列表,但我认为您很可能找不到完全符合您需要的内容。如果这是一次性操作,那么执行全局搜索和替换来完成此任务将非常简单。这是否需要重复执行?您使用C#标记了这个内容 - 您是否对一些C#代码感兴趣,以执行后处理搜索和替换? – kmote 2012-02-26 03:14:23

+0

'xlTextWindows'是定义换行符或多个字符的常量之一。 Windows使用CR LF。使用Excel,将工作簿另存为CSV不会在文本字段周围放置双引号,除非它包含逗号。 C#是不同的,或者你的字段中有逗号。我知道Excel将使用分号作为CSV分隔符,如果小数点分隔符被指定为逗号。这通常是一个国家设置,但C#具有允许临时的国家设置的功能,这可能值得一试。 – 2012-02-26 11:27:23

回答

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 2012-11-26 10:12:31

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解决方案对你完全没用,我很抱歉!

相关问题