同事遇到一個需求,須將Data匯出成已排版完成的Word檔,
成為一份電子書,給予User下載。還需要有封面、目錄、速查表等頁面。
最後同事決定,將Data彙整於DataTable中,
並將所有Data於DataTable中,將所有資料均排版完成。
原始資料如下圖,是一般常見的資料狀況:
經過編輯後,被排版成下圖,
這樣的好處是,可以將此排版好的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檔案囉~~~
這張報表(這算報表嗎?!)實在是不好寫,
也順便記錄下同事的Ideal,如果下次遇到,也可以參考。
這樣就可以將程式拆開,不會又要排版又要寫資料..又要計算頁次等一堆事情,
全擠在同一支程式裡,大大的增加了程式的可維護性囉~~
讚!!!
(順帶一提,同事的Word套表,是用Html方式產生套表的。)
沒有留言:
張貼留言