關於我

我的相片
用心思考、保持熱情,把工作上的經驗作分享與紀錄。希望能夠跟大家一起不斷的成長~

Oledb Export DataSet to Excel

同事遇到一個需求,須將Data匯出成已排版完成的Word檔,

成為一份電子書,給予User下載。還需要有封面、目錄、速查表等頁面。

最後同事決定,將Data彙整於DataTable中,

並將所有Data於DataTable中,將所有資料均排版完成。

原始資料如下圖,是一般常見的資料狀況:

擷取拷貝

經過編輯後,被排版成下圖,

擷取拷貝2

這樣的好處是,可以將此排版好的DataTable,

直接用套表的方式匯出,後段程式只需注意套表與字型等問題即可,不需再費心於排版上。

在製作目錄或速查表等需計算頁數之頁面時,也將簡單許多。

 

而今天的重點來了,因為需要修改此段排版程式,須加入其他商業邏輯。

但排版好的DataTable,我們又看不到,怎麼快速確定是否正確呢?!

有了這個念頭,便想到之前有找到過將DataTable匯出為Excel的參考範例

今天趕緊將此找到的範例程式記錄下來。方便下此再次瞭解使用。

 

程式碼如下:

public static void ExportDataSetToExcel(DataSet data, String excelFileName)
{
  System.IO.File.Delete(excelFileName);
  string strConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
  + System.IO.Path.GetDirectoryName(excelFileName) + @"\" + System.IO.Path.GetFileName(excelFileName)
  + @";Extended Properties='Excel 8.0;HDR=YES'";
  using (System.Data.OleDb.OleDbConnection objConn = new
  System.Data.OleDb.OleDbConnection(strConnectionString))
  using (System.Data.OleDb.OleDbCommand cmd = new
  System.Data.OleDb.OleDbCommand("", objConn))
  {
    objConn.Open();
    foreach (DataTable dt in data.Tables)
    {
      cmd.CommandText = "CREATE TABLE [" + dt.TableName + "] (";
      String valueNames = "(";
      Boolean first = true;
      foreach (DataColumn dc in dt.Columns)
      {
        if (!first)
        {
          cmd.CommandText += ",\r\n";
          valueNames += ", ";
        }
        cmd.CommandText += " [" + dc.ColumnName + "] NVARCHAR(100)";
        valueNames += " [" + dc.ColumnName + "]";
        first = false;
      }
      cmd.CommandText += ")";
      valueNames += ")";
      cmd.ExecuteNonQuery();
      foreach (DataRow dr in dt.Rows)
      {
        String values = "(";
        first = true;
        foreach (DataColumn dc in dt.Columns)
        {
          if (!first)
            values += ", ";
          values += " '" + dr[dc] + "'";
          first = false;
        }
        values += ")";
        cmd.CommandText = "INSERT INTO [" + dt.TableName + "$] " +
        valueNames + " VALUES " + values;
        cmd.ExecuteNonQuery();
      }
    }
  }
}

而上方兩張截圖,就是用此方式,將DataTable匯出程Excel後,

開啟之結果。用此方式快速許多。

最後,就完成了排版完成的Word檔案囉~~~

擷取拷貝3

這張報表(這算報表嗎?!)實在是不好寫,

也順便記錄下同事的Ideal,如果下次遇到,也可以參考。

這樣就可以將程式拆開,不會又要排版又要寫資料..又要計算頁次等一堆事情,

全擠在同一支程式裡,大大的增加了程式的可維護性囉~~

讚!!!

(順帶一提,同事的Word套表,是用Html方式產生套表的。)

沒有留言:

張貼留言