2013-07-25 22 views
5

Tôi đang tạo một ứng dụng nhỏ đọc tệp văn bản được phân tách bằng tab, thực hiện một vài thay đổi và sau đó tạo tệp .xlsx Excel 2007. Tôi đang gặp khó khăn trong việc tìm ra cách lấy các dòng từ một mảng chuỗi và ghi chúng vào tệp Excel, sử dụng các tab để chia dòng thành các cột. Tôi hy vọng rằng ý thức thực hiện.Làm thế nào tôi có thể viết một mảng chuỗi vào tệp Excel, với một dấu phân tách tab?

Tôi có string Lines[] có chứa một cái gì đó như thế này:

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

tôi muốn tạo một tập tin Excel mà trông như thế này:

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

tôi đã cố gắng điều sau đây, nhưng nó chỉ puts dòng đầu tiên từ Lines[] vào mỗi hàng và không tách thành các cột:

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; 

Mọi lời khuyên sẽ được đánh giá cao! Cảm ơn bạn!

Dưới đây là đầu ra Tôi hiện đang nhận được:

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

EDIT: Tôi đã cập nhật mã của tôi với đề nghị @ jiverson và dòng hiện đang chia thành cột trong Excel, nhưng dòng đầu tiên từ Lines[] vẫn xuất hiện trong mọi hàng trong Excel. Tại sao?

EDIT # 2: Dưới đây là đoạn code làm việc Cập nhật:

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 
); 
+1

Tách chuỗi bằng cách sử dụng ''\ t'' và viết mỗi giá trị cho mỗi ô tương ứng – chancea

Trả lời

2

Vòng qua để thêm mỗi dòng và sau đó sử dụng văn bản vào các cột sau khi bạn thiết lập giá trị khoảng:

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 Reference

+0

Tôi đã thử phân tách bằng tab nhưng không nhận ra '\ t'. Điều này đầu tiên có thể được thay thế bằng 'CHR (9)' (Excel) nhưng trong ví dụ của tôi, tôi chỉ sử dụng '~'. –

+0

ah đẹp .. đã chia dòng thành các cột! tuy nhiên, tôi vẫn chỉ nhận được dòng đầu tiên từ 'Lines []' trên mỗi hàng. Tôi không chắc mình đang làm gì sai, nhưng tôi sẽ cập nhật câu hỏi ban đầu của mình. Cảm ơn! –

+1

Tôi thậm chí không nhận thấy điều đó. Tôi sẽ xem xét xem liệu tôi có thể làm cho các hàng khác hoạt động thay vì chỉ lặp lại dòng đầu tiên không. – jiverson

1

Điều này có thể giúp bạn. Cách tôi tạo tệp excel là đọc chuỗi từ tệp và gửi dữ liệu và tách riêng với , và lưu dưới dạng tệp .csv.

Có thể trong trường hợp của bạn, hãy thử thay thế \t bằng , và sau đó thử tạo tệp.

Mã này có thể cung cấp cho bạn ý tưởng. Tôi đã không thử nghiệm nó mặc dù.

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()); 
+0

Tôi vừa thử và chỉ cần đặt', 'thay vì' \ t' .. vẫn không chia chuỗi thành các cột. –

+0

Sau đó có thể được thử như @chancea đã nói –

+0

Trước đây tôi đã lưu mảng chuỗi vào tệp .txt và sau đó nhập thủ công tệp đó vào Excel hoạt động tuyệt vời .. Tôi chỉ muốn tránh bước thủ công đó và tạo tệp Excel theo lập trình . –

1

Bạn có thể chia mỗi chuỗi trong lines[] sử dụng tab '\t' và sau đó chỉ cần viết mỗi giá trị ra các tế bào tương ứng. Dưới đây là một ví dụ mà nên giúp bạn bắt đầu:

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]; 
     } 
    } 
+0

Cảm ơn .. điều này có vẻ như nó sẽ làm việc. Tuy nhiên, tôi đã chọn viết từng dòng thay vì ô theo ô. Nhưng cảm ơn vì đã chỉ cho tôi cách làm theo cách này! –

1

Bạn có thể đặt quan tâm đến việc sử dụng tính năng Text to Columns của Excel sẽ hiệu quả hơn cho tập dữ liệu lớn, thay vì lặp qua các ô.

Sau đây là macro được ghi lại Excel mà bạn có thể thích ứng để chạy từ C#. Lần đầu tiên tôi chuyển đổi \t thành ~, nhưng có thể là một số ký tự khác.

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ó thể hơi phức tạp khi sửa đổi để hoạt động từ C# nhưng hữu ích khi biết tùy chọn này.

+0

thanks .. 'Text to Columns' đã chia hàng thành các cột, nhưng tôi vẫn chỉ nhận được dòng đầu tiên từ' Lines [] 'xuất hiện trên mỗi hàng. –

Các vấn đề liên quan