2012-03-29 4 views
1

Ich versuche, eine Datentabelle in eine XLS-Datei zu exportieren. Hier sind meine Code:So ändern Sie XLS Spalte DataType mit .NET

using ExcelIt = Microsoft.Office.Interop.Excel; 

protected void Export2xlsWorkBook(string filename) 
     { 
      if (filename != string.Empty) 
      { 
       if (filename.EndsWith(".xls")) 
        filename = txtNewFileName.Text + ".xls"; 
      } 
      else 
       filename = "NewFile.xls"; 

      filename = "C:\\Documents and Settings\\My Documents\\Exported XLS\\" + filename; 

      ExcelIt.Application objXL = new ExcelIt.Application(); 
      ExcelIt.Workbook oWB; 
      ExcelIt.Worksheet oSheet; 
      ExcelIt.Range oRange; 

      objXL.Visible = true; 
      objXL.DisplayAlerts = false; 

      oWB = objXL.Workbooks.Add(Missing.Value); 

      DataTable dt = CreateDataTable(); 

      oSheet = (ExcelIt.Worksheet)oWB.ActiveSheet; 
      oSheet.Name = "Exported Table"; 

      int rowCount = 1; 
      foreach (DataRow dr in dt.Rows) 
      { 
       rowCount += 1; 
       for (int i = 1; i < dt.Columns.Count + 1; i++) 
       { 
        if (rowCount == 2) 
        { 
         oSheet.Cells[1, i] = dt.Columns[i - 1].ColumnName; 
        } 
        oSheet.Cells[rowCount, i] = dr[i - 1].ToString(); 
       } 
      } 

      oRange = oSheet.get_Range(oSheet.Cells[1, 1], 
          oSheet.Cells[rowCount, dt.Columns.Count]); 

      oRange.EntireColumn.AutoFit(); 

      oRange = oSheet.get_Range(oSheet.Cells[1, 2], oSheet.Cells[rowCount + 10, dt.Columns.Count]); 

      oSheet.Protection.AllowEditRanges.Add("NonePK", oRange, Missing.Value); 

      oRange = oSheet.get_Range(oSheet.Cells[rowCount + 1, 1], oSheet.Cells[rowCount + 10, 1]); 

      oSheet.Protection.AllowEditRanges.Add("PKEmptyRow", oRange, Missing.Value); 

      oSheet._Protect(Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); 

      oSheet = null; 
      oRange = null; 

      oWB.SaveAs(filename, ExcelIt.XlFileFormat.xlWorkbookNormal, 
       Missing.Value, Missing.Value, Missing.Value, Missing.Value, 
       ExcelIt.XlSaveAsAccessMode.xlExclusive, 
       Missing.Value, Missing.Value, Missing.Value, 
       Missing.Value, Missing.Value); 

      oWB.Close(Missing.Value, Missing.Value, Missing.Value); 
      oWB = null; 
      objXL.Quit(); 

      GC.WaitForPendingFinalizers(); 
      GC.Collect(); 
      GC.WaitForPendingFinalizers(); 
      GC.Collect(); 
     } 

Aus bestimmten Gründen möchte ich mag: alle Spalten Set-Datentyp in Text. Derzeit, da ich nichts angegeben habe, werden die Datentypen stattdessen in "allgemein" gesetzt.

Kann mir jemand Ratschläge geben, wie dies zu erreichen ist? Grüße

+1

verwenden kann ich bemerkt, dass Sie nicht COM Bereinigung tun. Tun Sie dies für jede Interop-Referenz. Hoffe es hilft! if (writeRange! = null) { Marshal.FinalReleaseComObject (writeRange); writeRange = null; } –

Antwort

2

Sie Range.NumberFormat Property

Range usedRange = oSheet.UsedRange; 
usedRange.NumberFormat = "@"; 
+0

Was bedeutet das @? Und wie stelle ich sicher, dass das Bereichsformat "Text" ist? – rofans91

+0

'@' ist das Textzellenformat. Sie können dies in Makros sehen, aufgezeichnet von Excel – turbanoff

+1

@turbanoff Sind Sie ein Delphi-Entwickler? :) –

Verwandte Themen