link: http://www.cnblogs.com/heone/archive/2008/08/29/1279189.html
author: 天下鹰
content:
简述
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++;
}