2012-10-03 33 views
2

我正在使用此功能將數據表導出到excel中。如何使用正確的格式導出數據表並在Excel中使用C#編寫文本Microsoft.Office.Interop.Excel?

protected void ExportExcel(System.Data.DataTable dt) 
    { 
     if (dt == null||dt.Rows.Count==0) return; 
     Microsoft.Office.Interop.Excel.Application xlApp = 
new Microsoft.Office.Interop.Excel.Application(); 

if (xlApp == null) 
{ 
    return; 
} 
System.Globalization.CultureInfo CurrentCI = 
System.Threading.Thread.CurrentThread.CurrentCulture; 
System.Threading.Thread.CurrentThread.CurrentCulture = 
    new System.Globalization.CultureInfo("en-US"); 
Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks; 
Microsoft.Office.Interop.Excel.Workbook workbook = 
workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet); 
Microsoft.Office.Interop.Excel.Worksheet worksheet = 
(Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1]; 
Microsoft.Office.Interop.Excel.Range range; 
long totalCount = dt.Rows.Count; 
long rowRead = 0; 
float percent = 0; 
for (int i = 0; i < dt.Columns.Count; i++) 
{ 
    worksheet.Cells[1, i + 1] = dt.Columns[i].ColumnName; 
    range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, i + 1]; 
    range.Interior.ColorIndex = 15; 
    range.Font.Bold = true; 

} 

for (int r = 0; r < dt.Rows.Count; r++) 
{ 
    for (int i = 0; i < dt.Columns.Count; i++) 
    { 
     worksheet.Cells[r + 2, i + 1] = dt.Rows[r][i].ToString(); 
    } 
    rowRead++; 
    percent = ((float)(100 * rowRead))/totalCount; 
} 

xlApp.Visible = true; 
} 

RESULT iMAGE

正如你所生成的Excel工作圖片中看到,列的格式不正確,即列的大小不太適應數據綁定物品。我怎樣才能讓excel單元根據數據表自動調整?

而且我還想添加一些文本,也許是標題,可能是「System.DateTime.Now」或「數據表名稱」。我該怎麼做呢?

回答

6

你應該能夠格式化列像這樣:

Microsoft.Office.Interop.Excel.Range columns = worksheet.UsedRange.Columns; 
columns.AutoFit(); 

您可以插入新行,並把當前日期作爲標題,像這樣:

worksheet.Rows[1].Insert(); 
Excel.Range newRow = worksheet.Rows[1]; 
Excel.Range newCell = newRow.Cells[1]; 
newCell.Value = DateTime.Now.ToString("yyyy-MM-dd"); 

同時添加這您的使用語句,因此每次使用Excel對象時不需要使用完全限定名稱:

using Excel = Microsoft.Office.Interop.Excel; 

另外,我還收拾你的方法,通過使用語句,以減少混亂增加了一些,去除一些不必要的鑄造和應用程序對象上的空的unnesscessary檢查,它已被分配剛過:

using Excel = Microsoft.Office.Interop.Excel; 
using System.Globalization; 
using System.Threading; 
using System.Data; 

protected void ExportExcel(DataTable dt) 
{ 
    if (dt == null || dt.Rows.Count == 0) return; 

    var xlApp = new Excel.Application(); 
    //Is this used? 
    CultureInfo CurrentCI = Thread.CurrentThread.CurrentCulture; 

    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); 

    Excel.Workbooks workbooks = xlApp.Workbooks; 

    Excel.Range range 

    Excel.Workbook workbook = workbooks.Add(); 
    Excel.Worksheet worksheet = workbook.Worksheets[1]; 

    long totalCount = dt.Rows.Count; 
    long rowRead = 0; 
    float percent = 0; 

    for (var i = 0; i < dt.Columns.Count; i++) 
    { 
     worksheet.Cells[1, i + 1] = dt.Columns[i].ColumnName; 

     range = worksheet.Cells[1, i + 1]; 
     range.Interior.ColorIndex = 15; 
     range.Font.Bold = true; 
    } 

    for (var r = 0; r < dt.Rows.Count; r++) 
    { 
     for (var i = 0; i < dt.Columns.Count; i++) 
     { 
      worksheet.Cells[r + 2, i + 1] = dt.Rows[r][i].ToString(); 
     } 

     rowRead++; 

     //is this used? 
     percent = ((float)(100 * rowRead))/totalCount; 
    }  

    Microsoft.Office.Interop.Excel.Range columns = worksheet.UsedRange.Columns; 
    columns.AutoFit(); 

    worksheet.Rows[1].Insert(); 
    Excel.Range newRow = worksheet.Rows[1]; 
    Excel.Range newCell = newRow.Cells[1]; 
    newCell.Value = DateTime.Now.ToString("yyyy-MM-dd"); 

    xlApp.Visible = true; 
} 
+0

我試着你的代碼有一些錯誤。 on line「entireSheet.AutoFit();」 - COMexception未處理 - Range類的AutoFit方法失敗。在線「Excel.Range newRow = worksheet.Rows.Insert();」 - COMexception未處理 - 「爲防止可能的數據丟失,Excel無法將非空白單元格從工作表中移出。選擇另一個位置來插入新單元格,或從工作表末尾刪除數據。」 – user919789

+0

道歉,已更新答案 – JMK

+0

完美的作品!謝了哥們! – user919789

相關問題