您的位置:首页 > 其它

excel报表开发-- 根据datatable个数自动生成新sheet

2016-03-16 10:24 519 查看
总结一下很久之前做的报表小程序,今日有问题又调试了一下。

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();//设置列宽自动适应

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: