ASP.net 读写Excel模版
1.1.1引用的添加
添加引用后会在程序的bin目录下有一个Interop.Excel.dll文件,在应用程序页面添加引用的命名空间using Excel;
1.1.2模板的读写方法
读模板的话,首先模板存放在某个路径下,根据模板把从数据库里取出的数据写回EXCEL然后生成一个新的EXCEL存放都另一个路径以供下载,模板不变。
//建立一个Excel.Application的新进程
Excel.Applicationapp = newExcel.Application();
if(app == null)
{
return;
}
app.Visible = false;
app.UserControl = true;
Workbooksworkbooks = app.Workbooks;
_Workbookworkbook = workbooks.Add(template_path + """测试.xls");//这里的Add方法里的参数就是模板的路径
Sheetssheets = workbook.Worksheets;
_Worksheetworksheet = (_Worksheet)sheets.get_Item(1);//这里表示模板只有一个sheet表
if(worksheet == null)
{
return;
}
如果没有实际的物理模板,可以继承一个空的模板进行读写
_Workbookworkbook = workbooks.Add(XlWBATemplate.xlWBATWorksheet);//这里的Add方法里的参数就相当于继承了一个空模板
单元格的赋值如下
worksheet.Cells[i, i] = "XX";//表示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);//行高设定为24
设置连续单元格的背景颜色
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],12);//字体设为12号大小
单元格字体的设置
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 = "xx";//给合并后的单元格赋值,合并后的单元格为第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各为例),可以这样进行读写访问
_Worksheetworksheet1 = (_Worksheet)sheets.get_Item(1);//读第一个sheet
_Worksheetworksheet2 = (_Worksheet)sheets.get_Item(2);//读第二个sheet
赋值操作和上面说的类似,如下:
Worksheet1.Cells[i, i] = "XXX";
Worksheet2.Cells[i, i] = "XXXX";
2.如果要在应用程序中动态生成多个sheet(以其中一个sheet为样本生成),如要按月份生成每月一个sheet,那么模板中只需包含一个sheet模板,可根据选择的月份个数在应用程序中复制相同的几个sheet即可。
for(inti = 1; i < monthCount; i++)
worksheet.Copy(Missing.Value, workbook.Worksheets[1]);//月统计工作薄,如果选择了三个月,即monthCount=3,那么就会再复制两个相同的sheet,然后进行读写操作,如下面的代码片段:
intitem_id = 1;
_Worksheetws = null;
for(inti = 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 = "XXName";//sheet的名称
item_id++;
}
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;
删除原来的空Sheet
((Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets.get_Item(1)).Delete()
设置默认选中是第一个Sheet 类似于Select();
((Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets.get_Item(1)).Activate();