2

この関数を使用して、データ テーブルを 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;
}

結果画像

結果の Excel 画像でわかるように、列が適切にフォーマットされていません。つまり、列のサイズがデータバインドされたアイテムに適合していません。データ テーブルに従って Excel セルを自動調整するにはどうすればよいですか?

また、「System.DateTime.Now」や「データテーブル名」などのテキスト、おそらくヘッダーを追加したいと思います。どうすればいいですか?

4

1 に答える 1

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");

また、これを using ステートメントに追加して、Excel オブジェクトを使用するたびに完全修飾名を使用する必要がないようにします。

using Excel = Microsoft.Office.Interop.Excel;

また、いくつかの using ステートメントを追加して混乱を減らし、不要なキャストを削除し、アプリケーション オブジェクトが割り当てられた直後に null の不必要なチェックを行うことで、メソッドを整理しました。

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;
}
于 2012-10-03T13:08:58.470 に答える