前言
公司最近有操作excel的需求:店名上传上来的excel都没有地址这一栏,但是有对应的编号,由于有上百个excel文件各个分店要是手工填写的话基本不可能,所以有劳我想办法了:)我倒是知道能操作,但是没有具体实践过.以下是摸索的点滴:
开发环境
window XP,Microsoft Visual Studio 2005,C#,ASP.NET,Office2003,SQL SERVER2000
推荐/参考文章
1.强烈推荐Excel VBA文档,如果你安装了office2003的话,安装目录下有个叫VBAXL10.CHM的帮助文档就是了,并且是中文的!!例如,我安装的在D盘,那么这个文件的地址是:D:\Program Files\Microsoft Office\OFFICE11\2052\VBAXL10.CHM
2.主要参考C#向Excel报表中插入图片的2种方法,将Excel应用于报表开发系列文章共8篇等文章.
目的,步骤
1.通过程序打开excel
2.读取编号列
3.根据编号在数据库中查询对应的地址并返回数据
4.把对应的地址插入excel
5.通过程序保存关闭excel,下一个...
正题
1.(新建工程等步骤在这里都省略了)添加操作excel的COM组件:
2.主要的方法代码:
///
<summary>
///
修改Excel
///
</summary>
///
<param name="Path">
读取路径
</param>
///
<param name="newPath">
另存路径
</param>
///
<param name="shop_name">
店名
</param>
///
<param name="tablename">
表名
</param>
public
void
AlterExcel(
string
Path,
string
newPath,
string
shop_name,
string
tablename)
{
try
{
Object miss
=
System.Reflection.Missing.Value;
Excel.Application ExcelApp
=
new
Excel.ApplicationClass();
Excel.Workbooks wbooks
=
(Excel.Workbooks)ExcelApp.Workbooks;
Excel.Workbook wbook
=
wbooks.Open(Path, miss, miss, miss, miss, miss, miss, miss, miss, miss, miss, miss, miss, miss, miss);
//
获得第一个工作薄
Excel.Worksheet wsheet
=
(Excel.Worksheet)wbook.Worksheets.get_Item(
1
);
ExcelApp.Visible
=
false
;
ExcelApp.DisplayAlerts
=
false
;
//
取得编号
ArrayList arr
=
new
ArrayList();
for
(
int
i
=
3
, j
=
wsheet.UsedRange.Rows.Count; i
<
j; i
++
)
{
Excel.Range rang
=
(Excel.Range)wsheet.Cells[i,
2
];
if
(
null
!=
rang.Text
&&
rang.Text.ToString().Length
>
0
)
arr.Add(rang.Text);
else
break
;
}
//
添加新行 Cells[行,列]
((Excel.Range)wsheet.Columns.get_Item(
3
, miss)).Insert(XlInsertShiftDirection.xlShiftToRight, miss);
//
添加区域单元格
//
wsheet.get_Range(wsheet.Cells[2, 3], wsheet.Cells[wsheet.UsedRange.Rows.Count - 3, 3]).Insert(XlInsertShiftDirection.xlShiftToRight, miss);
//
设置标头
wsheet.Cells[
2
,
3
]
=
"
地址
"
;
((Excel.Range)wsheet.Columns.get_Item(
3
, miss)).ColumnWidth
=
25
;
//
此处为获得该店的所有地址,这里替换成自己的方法就行
Hashtable hash
=
GetShopAddr(shop_name, tablename);
for
(
int
i
=
3
, j
=
i
+
arr.Count; i
<
j; i
++
)
{
try
{
//
根据编号设置地址
wsheet.Cells[i,
3
]
=
hash[Convert.ToInt32(arr[i
-
3
])];
}
catch
(Exception)
{
continue
;
}
}
//
另存为
wbook.SaveAs(newPath, miss, miss, miss, miss, miss, Excel.XlSaveAsAccessMode.xlNoChange, miss, miss, miss, miss, miss);
wbook.Close(
false
, miss, miss);
ExcelApp.Quit();
ReleaseObject(wsheet);
ReleaseObject(wbook);
ReleaseObject(wbooks);
ReleaseObject(ExcelApp);
GC.Collect();
GC.WaitForPendingFinalizers();
}
catch
{
//
throw;
}
finally
{
//
结束进程
//
KillExcelProcess();
}
}
///
<summary>
///
释放对象
///
</summary>
///
<param name="obj"></param>
private
void
ReleaseObject(
object
obj)
{
try
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
}
catch
{}
finally
{ obj
=
null
; }
}
///
<summary>
///
结束Excel进程
///
</summary>
public
void
KillExcelProcess()
{
Process[] myProcesses
=
Process.GetProcessesByName(
"
Excel
"
);
foreach
(Process myProcess
in
myProcesses)
myProcess.Kill();
}
注意:
a).需要添加命名空间using Microsoft.Office.Interop.Excel;
b).添加新行处代码两个都行,一个是添加一列一个是添加一个范围的单元格,达到效果是一样的
最后推荐一个网站和一个论坛:
Excel终极伴侣 http://www.chinaobs.com/
MSDN http://msdn.microsoft.com/library/CHS/dv_wrcore/html/wrgrfexcelobjects.asp