您的位置:首页 > 编程语言 > ASP

ASP.NET下Excel界面输出控制

2010-11-08 16:51 274 查看
访问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可以做的出來喔:

01



/**//// <summary>
02

/// 傳入DataTable後,透過Response.Write將資料寫到client端,並指定為Excel格式
03

/// </summary>
04

/// <param name="pDataTable">資料來源</param>
05

public void ExportDataTableToExcel(DataTable pDataTable)
06



...{
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:

01



/**//// <summary>
02

/// 傳入DataTable後,透過Response.Write將資料寫到client端,並指定為Excel格式
03

/// </summary>
04

/// <param name="pDataTable">資料來源</param>
05

public void ExportDataTableToExcel(DataTable pDataTable)
06



...{
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欄位的小數位數出來囉,



這個方法或許不是最快的,但用到現在我覺得他彈性算是最大的,因為格式、顏色都可以自行定義
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: