ASP.net 读写Excel模版

1.1 使用范围

该操作适用于VS2005及以上版本。

函数调用说明

1.1.1 引用的添加

右键添加引用Excel Library,VS2005为11.0版本,VS2008为12.0版本

添加引用后会在程序的bin目录下有一个Interop.Excel.dll文件,在应用程序页面添加引用的命名空间 using Excel;

1.1.2 模板的读写方法

读模板的话,首先模板存放在某个路径下,根据模板把从数据库里取出的数据写回EXCEL然后生成一个新的EXCEL存放都另一个路径以供下载,模板不变。

//建立一个Excel.Application的新进程

Excel.Application app = new Excel.Application();

if (app == null)

{

return;

}

app.Visible = false;

app.UserControl = true;

Workbooks workbooks = app.Workbooks;

_Workbook workbook = workbooks.Add(template_path + """测试.xls");//这里的Add方法里的参数就是模板的路径 Sheets sheets = workbook.Worksheets;

_Worksheet worksheet = (_Worksheet)sheets.get_Item(1); //这里表示模板只有一个sheet表

if (worksheet == null)

{

return;

}

如果没有实际的物理模板,可以继承一个空的模板进行读写

_Workbook workbook = workbooks.Add(XlWBATemplate.xlWBATWorksheet);//这里的Add方法里的参数就相当于继承了一个空模板

单元格的赋值如下

worksheet.Cells[i, i] = "达达集团";//表示EXCEL表的第i行第i列,对其它行列的赋值也一样

1.1.3 方法的调用

关于单元格处理的操作类在ExcelOperate.cs类文件里

设置连续单元格边框颜色

worksheet.get_Range(worksheet.Cells[i,1],worksheet.Cells[i, 14]).Borders.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);//表示第i行的第1列到14列的边框颜色为黑色,只需给定开始单元格和结束单元格

设置行高

excelOperate.SetRowHeight(worksheet, worksheet.Cells[i,1],worksheet.Cells[i, 14], 24.75);//行高设定为24.75

设置连续单元格的背景颜色

excelOperate.SetBgColor(worksheet, worksheet.Cells[i,1],worksheet.Cells[i,14], System.Drawing.Color.Silver);//设置背景颜色为银白色

设置连续单元格的字体大小

excelOperate.SetFontSize(worksheet, worksheet.Cells[i,1],worksheet.Cells[i,14],16);//字体设为16号大小

单元格字体的设置

excelOperate.SetBold(worksheet, worksheet.Cells[i,1],worksheet.Cells[i,14]);//黑体字

单元格字体颜色设置

excelOperate.SetColor(worksheet, worksheet.Cells[i,1],worksheet.Cells[i,14], System.Drawing.Color.Red); //体字颜色设为红色

单元格内容剧中显示设置

excelOperate.SetHAlignCenter(worksheet, worksheet.Cells[i,1],worksheet.Cells[i,14]);

合并单元格

worksheet.get_Range(worksheet.Cells[i,1],worksheet.Cells[i,14]).Merge(Missing.Value);//合并第i行1至14列的单元格 worksheet.get_Range (worksheet.Cells[i,1],worksheet.Cells[i,1]).Value2 = "无赖集团";//给合并后的单元格赋值,合并后的单元格为第i行的第一个单元格

(注:如果在程序中动态合并单元格,合并前必须保证各单元格的内容为空,所以一般在合并相同内容的单元格之前,先保存原有的值,清空要合并的单元格的值,然后进行合并操作再赋值即可,之所以要清空是因为我们在操作实际的EXCEL合并单元格的时候,如果各单元格有值,鼠标操作合并的时候会提示“选定区域包含多重数值。合并到一个单元格后只能保留最左上角的数据” ,点确定后单元格会保留最左上单元格的值,而程序执行过程中遇到这种情况会直接导致程序执行中断,无法正常导出)

保存生成的EXCEL文件

workbook.SaveAs(save_path, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);//save_path为要保存到的文件路径

excelOperate.Dispose(worksheet, workbook, app);//生成好EXCEL文件后关闭Excel进程

EXCEL模板中含多个sheet的操作

1. 如果模板中只包含固定的多各sheet(以2各为例),可以这样进行读写访问

_Worksheet worksheet1 = (_Worksheet)sheets.get_Item(1);//读第一个sheet

_Worksheet worksheet2 = (_Worksheet)sheets.get_Item(2);//读第二个sheet

赋值操作和上面说的类似,如下:

Worksheet1.Cells[i, i] = "赖达犯罪集团";

Worksheet2.Cells[i, i] = "赖达破坏集团";

2. 如果要在应用程序中动态生成多个sheet(以其中一个sheet为样本生成),如要按月份生成每月一个sheet,那么模板中只需包含一个sheet模板,可根据选择的月份个数在应用程序中复制相同的几个sheet即可。

for (int i = 1; i < monthCount; i++)

worksheet.Copy(Missing.Value, workbook.Worksheets[1]);//月统计工作薄,如果选择了三个月,即monthCount=3,那么就会再复制两个相同的sheet,然后进行读写操作,如下面的代码片段:

int item_id = 1;

_Worksheet ws = null;

for (int i = 0; i < tableMM.Rows.Count; i++)

{

……

if (tableMM.Rows[i]["DATE_MONTH"].ToString() == Month)

{

ws = (_Worksheet)sheets.get_Item(item_id);

ws.Cells[3 + i, 1] = rowNum;

ws.Cells[3 + i, 2] = tableMM.Rows[i]["PROJNO"];

continue;

}

……

ws.Name = "XX月份";//sheet的名称

item_id++;

}