目前的商業工具如水晶報表,ActiveReport等,都提供了靈活,強大的功能,但是對於比較特殊化的表格,特別是國內的一些應用,都是一個個的格子組成的,這樣要是用線來一根根畫就比較麻煩,但是這類工具還都不提供表格化的報表布局定義方式。一個很好的選擇是VS2005的客戶端報表(RDLC),但是在某幾個方面還是不夠靈活,例如,靈活性有限制,要想自己編碼實現一些復雜邏輯還是有困難;要VS2005,對於一些還在使用VS2003的項目就只有眼饞的份了。用Excel來實現,優點在於頁面布局設計靈活,同時使用代碼來操作數據要更靈活,更精確。
下面是一個簡單的例子,打開一個定義好的Excel文件,這個文件是作為報表的模板,然後向模板的指定格子裡填充數據,形成一個報表,在web方式下可以按照指定的命名方式在服務器上生成一個excel文件,之後傳送到客戶端,由客戶端啟動Excel進行打印。
Excel.Application m_objExcel = null;
Excel._Workbook m_objBook = null;
Excel.Sheets m_obJSheets = null;
Excel._Worksheet m_obJSheet = null;
Excel.Range m_objRange = null;
object m_objOpt = System.Reflection.Missing.Value;
try
{
m_objExcel = new Excel.Application();
m_objBook = m_objExcel.Workbooks.Open("z:\\Book1.xls", m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);
m_obJSheets = (Excel.Sheets)m_objBook.Worksheets;
m_objSheet = (Excel._Worksheet)(m_obJSheets.get_Item(1));
string[] info = new string[5] { "Cure", "26", "dahuzizyd.cnblogs.com", "漢", "按時 ?放奧斯丁奧斯丁非是否奧斯丁非" };
m_objRange = m_obJSheet.get_Range("B1", m_objOpt);
m_objRange.Value = info[0];
m_objRange = m_obJSheet.get_Range("E1", m_objOpt);
m_objRange.Value = info[1];
m_objRange = m_obJSheet.get_Range("B2", m_objOpt);
m_objRange.Value = info[2];
m_objRange = m_obJSheet.get_Range("E2", m_objOpt);
m_objRange.Value = info[3];
m_objRange = m_obJSheet.get_Range("A3", m_objOpt);
m_objRange.Value = info[4];
m_objExcel.DisplayAlerts = false;
m_objBook.SaveAs("z:\\Book2.xls", m_objOpt, m_objOpt,
m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange,
m_objOpt, m_objOpt, m_objOpt, m_objOpt);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
m_objBook.Close(m_objOpt, m_objOpt, m_objOpt);
m_objExcel.Workbooks.Close();
m_objExcel.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(m_objBook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(m_objExcel);
m_objBook = null;
m_objExcel = null;
GC.Collect();
}
可以看到,使用Excel要進行一部分的編碼,好在這部分還不太復雜,但是最大的問題就在於當報表需求變更時,要重新編譯部署,而且當格子特別多的時候,要這樣硬編碼還是挺痛苦的一件事。不過使用Excel畢竟給我們提供了一種選擇,可以在開發時對多種方案權衡利弊,使用最適合項目的。