2013-07-25 19 views
5

Sto creando una piccola app che legge un file di testo delimitato da tabulazioni, apporta alcune modifiche e quindi crea un file .xlsx di Excel 2007. Ho difficoltà a capire come prendere le linee da una serie di stringhe e scriverle nel file Excel, usando le schede per suddividere la linea in colonne. Spero che abbia senso.Come posso scrivere una serie di stringhe su file Excel, con un delimitatore di tabulazione?

ho string Lines[] che contiene qualcosa di simile:

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

mi piacerebbe creare un file Excel che assomiglia a questo:

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

ho provato quanto segue, ma semplicemente mette la prima riga da Lines[] in ogni riga e non si separa in colonne:

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; 

Qualche consiglio sarebbe apprezzato! Grazie!

ecco l'output Attualmente sto ricevendo:

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

EDIT: Ho aggiornato il mio codice con il suggerimento di @ jiverson e la linea è ora divisa in colonne in Excel, ma la prima linea da Lines[] appare ancora in ogni riga in Excel. Perché?

EDIT # 2: Ecco il codice di lavoro aggiornato:

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

Dividere la stringa usando ''\ t'' e scrivere ogni valore in ogni cella corrispondente. – chancea

risposta

2

Loop tramite per aggiungere ogni riga e quindi utilizzare il testo per le colonne dopo aver impostato il valore di gamma:

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

Ho provato con delimitato da tabulazioni ma non ha riconosciuto '\ t'. Questo potrebbe essere prima sostituito con 'CHR (9)' (Excel) ma nel mio esempio ho usato '~'. –

+0

ah bello .. che ha diviso la fila in colonne! tuttavia, sto ancora ricevendo solo la prima riga da 'Lines []' su ogni riga. Non sono sicuro di cosa sto sbagliando, ma aggiornerò la mia domanda originale. Grazie! –

+1

Non me ne sono nemmeno accorto. Darò un'occhiata per vedere se riesco a far funzionare le altre righe invece di ripetere la prima riga. – jiverson

1

Questo può aiutare. Il modo in cui ho creato il file excel è leggere la stringa dal file e inviare un messaggio ai dati e separati con , e salvare come file .csv.

Potrebbe essere nel tuo caso provare a sostituire il \t con il , e quindi provare a creare il file.

Questo codice può darvi un'idea. Non l'ho provato però.

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

Ho appena provato e ho appena messo un', 'invece di un' \ t' .. ancora non dividi la stringa in colonne. –

+0

Quindi si può provare come @chancea ha detto –

+0

Stavo salvando in precedenza l'array di stringhe in un file .txt e poi manualmente importando quel file in Excel che funziona perfettamente. Voglio solo evitare quella fase manuale e creare il file Excel a livello di programmazione . –

1

È possibile dividere ogni stringa nel lines[] utilizzando la scheda '\t' e poi semplicemente scrivere ogni valore fuori alla cella corrispondente. Ecco un esempio che dovrebbe iniziare:

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

Grazie .. sembra che funzioni. Tuttavia, ho scelto di scrivere riga per riga anziché cella per cella. Ma grazie per avermi mostrato come farlo in questo modo! –

1

Potrebbero essere interessato all'utilizzo della funzione di Excel Text to Columns che sarà più efficiente per un set di dati di grandi dimensioni, piuttosto che il looping delle celle.

Quanto segue è una macro registrata in Excel che è possibile adattare per l'esecuzione da C#. Prima ho convertito \t in ~, ma potrebbe essere un altro personaggio.

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 

Potrebbe essere leggermente complicato modificare il funzionamento da C# ma è utile essere a conoscenza di questa opzione.

+0

grazie .. 'Testo su colonne 'ha diviso la riga in colonne, ma ho ancora solo la prima riga da' Linee [] 'che appaiono su ogni riga. –

Problemi correlati