如何使用制表符将字符串数组写入Excel文件

本文关键字:Excel 文件 数组 字符串 何使用 制表符 | 更新日期: 2023-09-27 18:24:52

我正在创建一个小型应用程序,它读取一个制表符分隔的文本文件,进行一些更改,然后创建一个Excel2007.xlsx文件。我很难弄清楚如何从字符串数组中提取行并将其写入Excel文件,使用选项卡将行分解为列。我希望这是有道理的。

我有string Lines[],它包含这样的东西:

Item1'tItem2'tItem3'tItem4
ItemA'tItemB'tItemC'tItemD
Item5'tItem6'tItem7'tItem8

我想创建一个Excel文件,看起来像这样:

A      B      C      D
Item1  Item2  Item3  Item4
ItemA  ItemB  ItemC  ItemD
Item5  Item6  Item7  Item8

我尝试了以下操作,但它只是将Lines[]中的第一行放入每一行,并且没有分隔成列:

string Lines[] = GetLines();
Excel.Application xlApp;
Excel.Workbook xlWb;
Excel.Worksheet xlWs;
object misValue = System.Reflection.Missing.Value;
xlApp = new Excel.Application();
xlWb = xlApp.Workbooks.Add(misValue);
xlWs = (Excel.Worksheet)xlWb.Worksheets.get_Item(1);
Excel.Range c1 = (Excel.Range)xlWs.Cells[2, 1];
Excel.Range c2 = (Excel.Range)xlWs.Cells[2 + lines.Length, 1];
Excel.Range range = xlWs.get_Range(c1, c2);
range.Value = lines;
range.TextToColumns(                 
    range,
    Microsoft.Office.Interop.Excel.XlTextParsingType.xlDelimited,
    Microsoft.Office.Interop.Excel.XlTextQualifier.xlTextQualifierNone,
    false,
    true    // This is flag to say it is tab delimited
);
xlApp.Visible = true;

任何建议都将不胜感激!非常感谢。

这是我目前得到的输出:

A                           B    C    D
Item1'tItem2'tItem3'tItem4
Item1'tItem2'tItem3'tItem4
Item1'tItem2'tItem3'tItem4

编辑:我已经根据@jiverson的建议更新了我的代码,这一行现在在Excel中被分隔成列,但Lines[]中的第一行仍然出现在Excel的每一行中。为什么

编辑#2:这是更新的工作代码:

Excel.Application xlApp;
Excel.Workbook xlWb;
Excel.Worksheet xlWs;
object misValue = System.Reflection.Missing.Value;
xlApp = new Excel.Application();
xlWb = xlApp.Workbooks.Add(misValue);
xlWs = (Excel.Worksheet)xlWb.Worksheets.get_Item(1);
int currentRow = 2;
string[] lines = GetLines();
for (int i = 0; i < lines.Length; i++)
{
    string line = lines[i]; //get the current line
    string[] values = line.Split(''t'); //split the line at the tabs
    //
    // .. i do some things to specific values here ..
    //
    lines[i] = String.Join("'t", values); //put the updated line back together
    Excel.Range currentRange = (Excel.Range)xlWs.Cells[currentRow, 1]; //get the next row
    currentRange.Value = lines[i];  //write the line to Excel
    currentRow++;
}
Excel.Range c1 = (Excel.Range)xlWs.Cells[2, 1]; //get the first cell
Excel.Range c2 = (Excel.Range)xlWs.Cells[2 + lines.Length, 1]; //get the last cell
Excel.Range range = xlWs.get_Range(c1, c2);  //set the range as the used area
range.TextToColumns( //split the row into columns
    range,
    Excel.XlTextParsingType.xlDelimited,
    Excel.XlTextQualifier.xlTextQualifierNone,
    false,
    true    // This is flag to say it is tab delimited
);

如何使用制表符将字符串数组写入Excel文件

循环添加每一行,然后在设置范围值后使用文本到列:

    for (int i = 0; i < range.Rows.Count; i++) {
        range.Rows[i].Value = lines[i];
        range.Rows[i].TextToColumns(
            range.Rows[i],
            Microsoft.Office.Interop.Excel.XlTextParsingType.xlDelimited,
            Microsoft.Office.Interop.Excel.XlTextQualifier.xlTextQualifierNone,
            false,
            true
        );          
    }

MSDN参考

这可能会对您有所帮助。我创建excel文件的方法是从文件中读取字符串并发送数据,用,分隔并保存为.csv文件。

在您的情况下,可能会尝试用,替换't,然后尝试创建文件。

这个代码可能会给你一个想法。不过我还没有测试过。

1               string filePath = @"C:'test.csv";  
2               string delimiter = ",";  
3    
4               string[][] output = new string[][]{  
5                   new string[]{"Col 1 Row 1", "Col 2 Row 1", "Col 3 Row 1"},  
6                   new string[]{"Col1 Row 2", "Col2 Row 2", "Col3 Row 2"}  
7               };  
8               int length = output.GetLength(0);  
9               StringBuilder sb = new StringBuilder();  
10              for (int index = 0; index < length; index++)  
11                  sb.AppendLine(string.Join(delimiter, output[index]));  
12   
13              File.WriteAllText(filePath, sb.ToString());

您可以使用选项卡''t'拆分lines[]中的每个字符串,然后将每个值写入相应的单元格。下面是一个应该让你开始的例子:

 for(int i = 0; i < lines.Length; i++)
   {
       String line = lines[i];
       Excel.Range c1 = (Excel.Range)xlWs.Cells[i+1, 1];
       Excel.Range c2 = (Excel.Range)xlWs.Cells[i+1, 1 + line.Length];
       Excel.Range range = xlWs.get_Range(c1, c2);
       string[] split = line.Split(''t');
       for (int c = 1; c <= split.Length; c++)
       {
          range.Cells[1, c] = split[c-1];
       }
   }

您可能有兴趣使用Excel的Text to Columns功能,该功能对于大型数据集来说更高效,而不是在单元格中循环。

下面是一个Excel录制的宏,您可以调整它以从C#运行。我首先将't转换为~,但它可能是其他字符。

Sub Macro1()
    Selection.Replace What:="'t", Replacement:="~", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
        :="~", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1)), _
        TrailingMinusNumbers:=True
End Sub

修改为从C#开始工作可能有点棘手,但注意这个选项是有用的。

我发现,简单地将值写入.csv文件,然后在Excel中打开它会更容易,也不会那么麻烦。

 public static void WriteToCvs<T>(this T[,] array, string fileName)
 {
     using (var stream = File.CreateText(fileName))
     {
         for (int i = 0; i < array.GetLength(0); i++)
         {
             var values = new List<T>();
             for (int j = 0; j < array.GetLength(1); j++)
             {
                 values.Add(array[i, j]);
             }
             stream.WriteLine(string.Join(",", values));
         }
     }
 }