ASP.NET下Excel界面输出控制

访问Excel的方式有多种,开发中本人使用过两种方式:一种是基于Excel COM进行的访问,可以实现全方位控制,但这种方式适合桌面程序,另一种使用基于<Table>的格式化输出,这种可定适合Web开发,一下代码摘自别人的博客:

一、基于COM组件方式

asp教程.net 导出excel并设置格式
添加引用:microsoft excel 11.0 object library ;

添加:using microsoft.office.interop.excel;


一、打开excel文件============================

  microsoft.office.interop.excel.application excel1 = new microsoft.office.interop.excel.application();

  workbook workbook1 = excel1.workbooks.open(@"e:aaa.xls", type.missing, type.missing, type.missing, type.missing, type.missing, type.missing, type.missing, type.missing, type.missing, type.missing, type.missing, type.missing, type.missing, type.missing);

  excel1.visible = true;

二、新建excel对象============================

  microsoft.office.interop.excel.application excel1 = new microsoft.office.interop.excel.application();

  workbook workbook1 = excel1.workbooks.add(xlwbatemplate.xlwbatworksheet或true);

  worksheet1.activate();//激活sheet1表

  excel1.visible = true;

三、新建excel表============================

  microsoft.office.interop.excel.application excel1 = new microsoft.office.interop.excel.application();

  workbook workbook1 = excel1.workbooks.add(true);

  worksheet worksheet1 = (worksheet)workbook1.worksheets["sheet1"];

  worksheet worksheet1 =(worksheet)workbook1.worksheets.add(type.missing,workbook1.worksheets[1], 1, type.missing);

  excel1.visible = true;

四、重命名excel表名============================

  microsoft.office.interop.excel.application excel1 = new microsoft.office.interop.excel.application();

  workbook workbook1 = excel1.workbooks.add(true);

  worksheet worksheet1 = (worksheet)workbook1.worksheets["sheet1"或1];

  worksheet1.name = "工作计划表";

  excel1.visible = true;

 

五、设置或修改excel表单元格内容========================

  microsoft.office.interop.excel.application excel1 = new microsoft.office.interop.excel.application();

  workbook workbook1 = excel1.workbooks.add(true);

  worksheet worksheet1 = (worksheet)workbook1.worksheets["sheet1"];

  worksheet1.cells[1, 1] = "姓名";

  worksheet1.cells[1, 2] = "性别";

  excel1.visible = true;

六、设置excel表行宽和列高===========================

  microsoft.office.interop.excel.application excel1 = new microsoft.office.interop.excel.application();

  workbook workbook1 = excel1.workbooks.add(true);

  worksheet worksheet1 = (worksheet)workbook1.worksheets["sheet1"];

  worksheet1.columns.columnwidth = 20;//全局行宽

  worksheet1.columns.rowheight = 20;//全局列高

  range range1 = (range) worksheet1.cells[2, 1];

  range1.columns.columnwidth = 40;//单元格行宽

  range1.columns.rowheight = 40;//单元格列高

  excel1.visible = true;

七、设置excel表单元格边框===========================

  microsoft.office.interop.excel.application excel1 = new microsoft.office.interop.excel.application();

  workbook workbook1 = excel1.workbooks.add(true);

  worksheet worksheet1 = (worksheet)workbook1.worksheets["sheet1"];

  range range1 = (range)worksheet1.cells[2, 2];

  range1.borders.color = system.drawing.colortranslator.toole(color.red);

  range1.borders.get_item(xlbordersindex.xledgetop).linestyle = xllinestyle.xlcontinuous;

  range1.borders.get_item(xlbordersindex.xledgeright).linestyle = xllinestyle.xlcontinuous;

  range1.borders.get_item(xlbordersindex.xledgebottom).linestyle = xllinestyle.xlcontinuous;

  range1.borders.get_item(xlbordersindex.xledgeleft).linestyle = xllinestyle.xlcontinuous;

  //也可用后面的代码代替上面四项range1.borderaround(xllinestyle.xlcontinuous, xlborderweight.xlthin, xlcolorindex.xlcolorindexautomatic,null);

  range1.borders.get_item(xlbordersindex.xldiagonaldown).linestyle = xllinestyle.xlcontinuous;//斜杠

  range1.borders.get_item(xlbordersindex.xldiagonalup).linestyle = xllinestyle.xlcontinuous;//反斜杠

  range1.borders.get_item(xlbordersindex.xldiagonaldown).color = system.drawing.colortranslator.toole(color.gold);

  excel1.visible = true;

八、excel表块操作============================

  microsoft.office.interop.excel.application excel1 = new microsoft.office.interop.excel.application();

  workbook workbook1 = excel1.workbooks.add(true);

  worksheet worksheet1 = (worksheet)workbook1.worksheets["sheet1"];

  range range1 = worksheet1.get_range("a2", "e8");//选择操作块

  range1.font.bold = true;//设置黑体

  range1.font.size = 18;//设置字体大小

  range1.font.name = "仿宋";//设置字体

  range1.font.color = system.drawing.colortranslator.toole(color.blue);//设置字体颜色

  range1.horizontalalignment = xlhalign.xlhaligncenter;//设置水平对齐方式

  range1.verticalalignment = xlvalign.xlvaligncenter;//设置垂直对齐方式  

  range1.value2 = "123rn456";

  range1.borders.get_item(xlbordersindex.xledgetop).linestyle = xllinestyle.xlcontinuous;

  range1.borders.get_item(xlbordersindex.xledgeright).linestyle = xllinestyle.xlcontinuous;

  range1.borders.get_item(xlbordersindex.xledgebottom).linestyle = xllinestyle.xlcontinuous;

  range1.borders.get_item(xlbordersindex.xledgeleft).linestyle = xllinestyle.xlcontinuous;

  //也可用后面的代码代替上面四项range1.borderaround(xllinestyle.xlcontinuous, xlborderweight.xlthin, xlcolorindex.xlcolorindexautomatic,null);

  range1.borders.get_item(xlbordersindex.xlinsidehorizontal).linestyle = xllinestyle.xlcontinuous;//块内竖线

  range1.borders.get_item(xlbordersindex.xlinsidevertical).linestyle = xllinestyle.xlcontinuous;//块内横线

  excel1.visible = true;

九、excel表单元格合并============================

  microsoft.office.interop.excel.application excel1 = new microsoft.office.interop.excel.application();

  workbook workbook1 = excel1.workbooks.add(true);

  worksheet worksheet1 = (worksheet)workbook1.worksheets["sheet1"];

  range range1 = worksheet1.get_range("a2", "e8");//选择操作块

  range1.value2 = "123rn456";

  excel1.application.displayalerts = false;//使合并操作不提示警告信息

  range1.merge(false);//参数为true则为每一行合并为一个单元格

  excel1.application.displayalerts = true;

  excel1.visible = true;

十、复制excel表============================

  microsoft.office.interop.excel.application excel1 = new microsoft.office.interop.excel.application();

  workbook workbook1 = excel1.workbooks.add(true);

  worksheet worksheet1 = (worksheet)workbook1.worksheets["sheet1"];

  worksheet1.cells[1, 1] = "123";

  worksheet1.copy(type.missing, worksheet1);

  worksheet worksheet2 =(worksheet)worksheet1.next;

  //worksheet2.name = "sheet2";

  excel1.visible = true;

十一、页面设置============================

 microsoft.office.interop.excel.application excel1 = new microsoft.office.interop.excel.application();

  workbook workbook1 = excel1.workbooks.add(true);

  excel1.caption = "我的报表";

  worksheet worksheet1 = (worksheet)workbook1.worksheets["sheet1"];

  worksheet1.pagesetup.papersize = xlpapersize.xlpapera3;//纸张大小

   worksheet1.pagesetup.printtitlerows = "$1:$3";//顶端标题行

  worksheet1.pagesetup.orientation = xlpageorientation.xllandscape;//页面方向为横向

  worksheet1.pagesetup.topmargin = excel1.centimeterstopoints(2);//上边距为2厘米(厘米转像素)

  worksheet1.pagesetup.bottommargin = excel1.centimeterstopoints(2);//下边距为2厘米(厘米转像素)

  worksheet1.pagesetup.leftmargin = excel1.centimeterstopoints(1.5);//左边距为1.5厘米(厘米转像素)

  worksheet1.pagesetup.rightmargin = excel1.centimeterstopoints(1.5);//右边距为1.5厘米(厘米转像素)

  worksheet1.pagesetup.headermargin = excel1.centimeterstopoints(1.2);//页眉边距为1.2厘米(厘米转像素)

  worksheet1.pagesetup.footermargin = excel1.centimeterstopoints(1);//页脚边距为1厘米(厘米转像素)

  worksheet1.pagesetup.centerhorizontally = true;//页面水平居中

  worksheet1.pagesetup.centervertically = false;//页面不垂直居中

  worksheet1.pagesetup.centerfooter = "第&p页,共&n页";//中间页脚内容

  excel1.visible = true;

 

 

 

二、基于<Table>格式化输出

 

以下function可以傳入DataTable後輕易的做到Excel下載的功能,主要是透過<Table>的方式來配置每個欄位,因此只要Html Table可以做到的設定,這個function可以做的出來喔:

0 1      /**/ /// <summary>
02     /// 傳入DataTable後,透過Response.Write將資料寫到client端,並指定為Excel格式
03     /// </summary>
04     /// <param name="pDataTable">資料來源</param>

0 5      public void ExportDataTableToExcel(DataTable pDataTable)
0 6      ... {
07         int tRowCount = pDataTable.Rows.Count;
08         int tColumnCount = pDataTable.Columns.Count;
09
10         Response.Expires = 0;
11         Response.Clear();
12         Response.Buffer = true;
13         Response.Charset = "utf-8";
14         Response.ContentEncoding = System.Text.Encoding.UTF8;
15         Response.ContentType = "application/vnd.ms-excel";
16         Response.AddHeader("Content-Disposition", "attachment; filename=Excel.xls");
17         Response.Write("<meta http-equiv=Content-Type content=text/html;charset=utf-8>");
18
19         Response.Write("<Table borderColor=black border=1>");
20         Response.Write("/n <TR>");
21         for (int i = 0; i < tColumnCount; i++)
22         ...{
23             Response.Write("/n <TD  bgcolor = #fff8dc>");
24             Response.Write(pDataTable.Columns[i].ColumnName);
25             Response.Write("/n </TD>");
26         }

27         Response.Write("/n </TR>");
28         for (int j = 0; j < tRowCount; j++)
29         ...{
30             Response.Write("/n <TR>");
31             for (int k = 0; k < tColumnCount; k++)
32             ...{
33                 Response.Write("/n <TD align=/"right/" x:num>");
34                 Response.Write(pDataTable.Rows[j][k].ToString());
35                 Response.Write("/n </TD>");
36             }

37             Response.Write("/n </TR>");
38         }

39
40         Response.Write("</Table>");
41
42         Response.End();
43     }

拿Northwind的Products資料表簡單的測試一下,發現果然如我們所預期,將Products整個Table的資料都匯出來囉:

也可以做欄位加總:

但我們發現UnitPrice這個欄位所存的值跟資料庫的值有所差異,資料庫中設定是小數位數4位,但匯出後小數點後的數值都不見了,如果我們要保留UnitPrice的小數點位數該怎麼做呢?

Step1.先取得欄位的schema小數位數,透過以下的SQL指令可取得Products欄位的schema

SELECT xprec,xscale, name AS ColumnName, type_name(xusertype) AS ColumnType  
FROM syscolumns WHERE (id = ( SELECT objid=id FROM sysobjects WHERE id= object_id( 'Products')))

 

看到UnitPrice這個欄位是小數點四位數,接著小改一下前面的code:

0 1      /**/ /// <summary>
02     /// 傳入DataTable後,透過Response.Write將資料寫到client端,並指定為Excel格式
03     /// </summary>
04     /// <param name="pDataTable">資料來源</param>

0 5      public void ExportDataTableToExcel(DataTable pDataTable)
0 6      ... {
07         int tRowCount = pDataTable.Rows.Count;
08         int tColumnCount = pDataTable.Columns.Count;
09
10         Response.Expires = 0;
11         Response.Clear();
12         Response.Buffer = true;
13         Response.Charset = "utf-8";
14         Response.ContentEncoding = System.Text.Encoding.UTF8;
15         Response.ContentType = "application/vnd.ms-excel";
16         Response.AddHeader("Content-Disposition", "attachment; filename=Excel.xls");
17         Response.Write("<meta http-equiv=Content-Type content=text/html;charset=utf-8>");
18
19         Response.Write("<Table borderColor=black border=1>");
20         Response.Write("/n <TR>");
21         for (int i = 0; i < tColumnCount; i++)
22         ...{
23             Response.Write("/n <TD  bgcolor = #fff8dc>");
24             Response.Write(pDataTable.Columns[i].ColumnName);
25             Response.Write("/n </TD>");
26         }

27         Response.Write("/n </TR>");
28         for (int j = 0; j < tRowCount; j++)
29         ...{
30             Response.Write("/n <TR>");
31             for (int k = 0; k < tColumnCount; k++)
32             ...{
33                 //如果是UnitPrice的話就補滿小數位數,小數位數部分可透過取得欄位的xscale來取得
34                 if (pDataTable.Columns[k].ColumnName == "UnitPrice")
35                 ...{
36                     Response.Write("/n<TD style='mso-number-format:/"0//." + "0".PadLeft(4, '0') + "/";'>");
37                 }

38                 else
39                 ...{
40                     Response.Write("/n <TD align=/"right/" x:num>");
41                 }

42                 Response.Write(pDataTable.Rows[j][k].ToString());
43                 Response.Write("/n </TD>");
44             }

45             Response.Write("/n </TR>");
46         }

47
48         Response.Write("</Table>");
49
50         Response.End();
51     }

再匯出一次,我們發現UnitPrice欄位的小數位數出來囉,

這個方法或許不是最快的,但用到現在我覺得他彈性算是最大的,因為格式、顏色都可以自行定義

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值