excel报表开发-- 根据datatable个数自动生成新sheet
2016-03-16 10:24
519 查看
总结一下很久之前做的报表小程序,今日有问题又调试了一下。
DB中存在一个表,记录了ID<自增长>,SqlStatement<sql查询语句>及其他必要字段,比如SheetName,ReferenceTable,InertDate等等
任务是循环表记录,针对SqlStatement语句查询结果,对应dataTable,如有数据则以一个sheet显示出来,如果没有数据则略过。
以下是循环生成sheet的代码:
调试监视:
以下是generate方法,调用的fill方法<带excel-sheet表头>:
DB中存在一个表,记录了ID<自增长>,SqlStatement<sql查询语句>及其他必要字段,比如SheetName,ReferenceTable,InertDate等等
任务是循环表记录,针对SqlStatement语句查询结果,对应dataTable,如有数据则以一个sheet显示出来,如果没有数据则略过。
以下是循环生成sheet的代码:
public static void Create(ref Workbook xBook, ref Application xApp, out string ReportDate) { Hashtable hash = new Hashtable(); IT_Check_ReportMgr reportMgr = new IT_Check_ReportMgr(); System.Data.DataTable ItCheckEecel = new System.Data.DataTable();//为了避免不明确引用 Worksheet ws; int idcount; reportMgr.Get_ITCheckID_Data(out idcount); DataSet ds = new DataSet(); ds = reportMgr.Get_ITCheck_Data(); string strReportDate = reportMgr.GetFlieGenerateDate(); ReportDate = strReportDate; string key = string.Empty; for (int i = 0; i < ds.Tables.Count;i++ ) { key = "dt" + i.ToString(); if (ds.Tables[i].Rows.Count==0) continue;//如果DT没有数据,则终止当前,开始新的循环 hash.Add(key, ds.Tables[i]); ws = (Worksheet)xBook.Sheets[xBook.Sheets.Count]; //获取sheet名 if (reportMgr.GetSheetName(i).Length >= 31) { ws.Name = reportMgr.GetSheetName(i).Substring(0, 30); } else { ws.Name = reportMgr.GetSheetName(i); } IT_Check_Report_Sheet sheetNew = new IT_Check_Report_Sheet(ref ws); sheetNew.Generate(hash, ws.Name, i); if ( i+1==ds.Tables.Count) continue; xBook.Sheets.Add(Type.Missing, xBook.Sheets[xBook.Sheets.Count], Type.Missing, Type.Missing); } hash.Clear(); ////删除无用的sheet //xApp.DisplayAlerts = false; //如果想删除某个sheet页,首先要将此项设为fasle,最开始生成excel因工作薄内至少含有一张可视工作表,开始时不可删除 //for (int i = 1; i < xApp.Worksheets.Count; i++) //{ // if (((Worksheet)xApp.Worksheets[i]).Name.IndexOf("Sheet")> -1)//sheetName中是否包含带有sheet名的工作表 // { // (xApp.ActiveWorkbook.Sheets[i] as Worksheet).Delete(); // } //} //xApp.DisplayAlerts = false; //把Sheet定位到第一个 Worksheet wsh = (Worksheet)xBook.Sheets[1]; wsh.Activate(); }
调试监视:
以下是generate方法,调用的fill方法<带excel-sheet表头>:
public bool Generate(Hashtable hash,string SheetName,int i) { System.Data.DataTable dt1 = (System.Data.DataTable)hash["dt"+i.ToString()]; sheet.Name = SheetName; sheet.Tab.Color = 0xFFFF; if (dt1.Rows.Count == 0) { return false; } Fill(dt1, startRowIndex, startColIndex, true); //设置列标题栏位 IT_Check_TitleStyle(dt1, sheet, dt1.Rows.Count); //增加筛选功能 IT_Check_HeaderFileter(dt1,sheet); return true; } protected void Fill(System.Data.DataTable dt, int rowStart, int colStart, bool isFormat) { int p = 80000; for (int beginIndex = 0; beginIndex < dt.Rows.Count; beginIndex += p) { int endIndex = dt.Rows.Count - 1; if (beginIndex + p < dt.Rows.Count) { endIndex = beginIndex + p - 1; } //dt先填充到二维数组中,再添加到range对象效率会高,用时变少 //填充sheet的列名 object[,] arr = new object[endIndex - beginIndex + 2, dt.Columns.Count]; for (int i = 0; i < dt.Columns.Count;i++ ) { arr[0,i]=dt.Columns[i].ColumnName; } for (int i = beginIndex; i <= endIndex; i++) { for (int j = 0; j < dt.Columns.Count; j++) { arr[i - beginIndex +1, j] = dt.Rows[i][j].ToString().Replace("=", ""); } } Range range = sheet.get_Range(sheet.Cells[rowStart + beginIndex + 1, colStart + 1], sheet.Cells[rowStart + endIndex + 2, colStart + dt.Columns.Count]); range.Rows.NumberFormat = "@";//在填充之前先设置整个range是text类型 if (isFormat) { // range.NumberFormat = "#,##0.00"; } range.Value2 = arr;//二维数组填充到range range.Borders.LineStyle = XlLineStyle.xlContinuous; range.Columns.EntireColumn.AutoFit();//设置列宽自动适应 } }
相关文章推荐
- 访问者模式
- Hyper-V配置(二)
- 工厂模式
- LINK:fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
- 编译原理动手实操:词法解析算法的一些概念说明
- SVN错误
- springmvc处理表单数据到后台
- JDBC数据库的API对照实例学习
- UITableView创建
- Java关键字——transient
- Spring配置中的<context:annotation-config/>
- Pow(x, n)
- Android webview禁止打开系统浏览器
- 第四天、婚礼上的谎言
- 软键盘的imeOptions 使用 差点忘记这个注意点了
- adb shell后出现error解决方案
- Ubuntu10.04下Linux内核编译的完整步骤
- adb shell后出现error解决方案
- windows MySQL数据库定时备份
- 策略模式