1、由dataset生成
3 w1 C! Q! X5 E z# g% M" U% T9 W. Q, N5 z代码如下:% c) o$ q& P$ u6 F) s
public void createexcel(dataset ds,string typeid,string filename)
. ]! L2 n' D1 r' D2 s: t{
% t- a0 k4 m6 B0 K6 c5 }4 ihttpresponse resp;
* Z* m+ a( d3 R G: mresp = page.response;& N9 h' ?/ `0 M# J6 q- u/ ?
resp.contentencoding = system.text.encoding.getencoding(gb2312);6 m. K& F, n6 J6 v7 ], a
resp.appendheader(content-disposition, attachment;filename= + filename);- I( t4 R/ r# W, n" t
string colheaders= , ls_item=;2 Q8 g% Y: s4 @
int i=0;
7 t' z0 S6 k( B9 l. R1 q//定义表对象与行对像,同时用dataset对其值进行初始化. u3 a5 [: h- D0 s
datatable dt=ds.tables[0];% ^% k7 B6 V) U; o6 V' G; R
datarow[] myrow=dt.select();1 Q+ A3 Y6 H- c3 T# O
// typeid==1时导出为excel格式文件;typeid==2时导出为xml格式文件
2 `) ]- N2 v5 o8 [! @2 oif(typeid==1)
/ z! F# c- |/ f% |* Y1 l" D, T$ t5 N{
6 [" F% o; v) p- E+ S9 n% W//取得数据表各列标题,各标题之间以t分割,最后一个列标题后加回车符
! J) `6 N3 d8 H a: Lfor(i=0;i colheaders+=dt.columns.caption.tostring()+t;* i" ~& m3 I/ `; u
colheaders +=dt.columns.caption.tostring() +n;& c8 b4 }6 |; Y9 j* l. t
//向http输出流中写入取得的数据信息* j% [- ~+ a6 P* r P* o4 Z
resp.write(colheaders);0 `" u. M8 P; H7 D3 P
//逐行处理数据
" K$ d4 M9 w, m1 \foreach(datarow row in myrow)$ u* e* |0 t3 ~# Q4 s/ m+ h* j* x
{% L& F4 W7 [: G9 @6 w( h. t
//在当前行中,逐列获得数据,数据之间以t分割,结束时加回车符n' \! ]2 k/ ~$ I
for(i=0;i ls_item +=row.tostring() + t;
# F9 h! Y, Q0 yls_item += row.tostring() +n;6 \! ^5 U& X" V2 O
//当前行数据写入http输出流,并且置空ls_item以便下行数据3 z1 N# l e9 u* r1 O# u
resp.write(ls_item);$ N# W1 o g4 ?, I
ls_item=;; g8 F/ H1 k S# O _/ i
}9 ~+ a; y" @. L$ u
}
7 Q- v- j4 z3 S n2 Y4 @else& Y( k- j" j# r3 p6 e
{6 T. l- z, ^5 k6 \5 f9 j
if(typeid==2)
3 W8 ~; t6 |! _9 S& F$ D3 r2 e0 g{
# D# K) z! |+ a0 p//从dataset中直接导出xml数据并且写到http输出流中1 n; z; S1 m3 t6 b. G
resp.write(ds.getxml());
! f- W, C+ t, z5 s [$ {, g}/ L9 L0 c: N1 X: ], d3 A
}
& r7 z+ r: i' i# ? e; @8 W' H//写缓冲区中的数据到http头文件中
3 l+ Q( W* j8 }' I1 ]: S iresp.end();
4 }% o3 ?9 q9 U# h1 q}
! w/ t- j- l4 P2、由datagrid生成
; i1 }& F. [$ W) ?. y# h代码如下:. D: ~9 J, R/ r7 H3 c! ]) a: W
public void toexcel(system.web.ui.control ctl)1 K2 }2 T/ @8 q! C; {% F
{8 p+ b( J0 l+ |# w
httpcontext.current.response.appendheader(content-disposition,attachment;filename=excel.xls);
" @! A% |: r2 Yhttpcontext.current.response.charset =utf-8;! a8 k2 N! Q- I- V i: c( v
httpcontext.current.response.contentencoding =system.text.encoding.default;6 E, e! b% `5 S, o4 W& j
httpcontext.current.response.contenttype =application/ms-excel;//image/jpeg;text/html;image/gif;vnd.ms-excel/msword2 U" y! a" J9 H0 {
ctl.page.enableviewstate =false;/ X; T8 C K+ l$ D% L3 t* A
system.io.stringwriter tw = new system.io.stringwriter() ;
F% I, w4 A% U. hsystem.web.ui.htmltextwriter hw = new system.web.ui.htmltextwriter (tw);2 a: _# O6 q7 f
ctl.rendercontrol(hw);
/ T+ Y5 [) h( V0 Z. W; v* v$ A! rhttpcontext.current.response.write(tw.tostring());* L0 f1 R+ u- n3 b2 L. @) s) ~2 ?
httpcontext.current.response.end();) {1 V. i# `- c1 `/ U
} E: h0 t/ f6 m G- Y- v3 F7 E
用法:toexcel(datagrid1);
- c5 I- {0 }& N K3、这个用dataview
. ^* F5 ]- t9 D1 p* C代码如下:
3 g' Y$ I6 w# x$ V( ~* Epublic void outputexcel(dataview dv,string str)! e/ L+ M* l" ~7 o- P; n
{7 F0 e# E* d- T* a
//
) V3 k$ K. J1 I6 d, q0 |// todo: 在此处添加构造函数逻辑
- B, Z1 V9 @* }9 t+ v8 U//+ o* s: ~) n& f* l4 V( Y, r. L
//dv为要输出到excel的数据,str为标题名称
% |3 _$ d- K& Ugc.collect();
5 S: _) w% e; u1 W% T7 b; Lapplication excel;// = new application();
0 O7 Z: h s U( J z* G: r0 Uint rowindex=4;
1 z. B* r( W% X. [# q& L1 Wint colindex=1;
( n! V, A+ a" G% t3 ?" ~+ b7 H_workbook xbk;
$ y8 N: a; [' Q# b ?3 f" ^- o_worksheet xst;1 Y( v1 ?$ C4 y" [# I
excel= new applicationclass();6 l! } S) A: K4 U/ N
xbk = excel.workbooks.add(true);
* i d+ ~: R0 j5 m6 Exst = (_worksheet)xbk.activesheet;
' D, ]# {( b- R7 O//
7 o6 [* a9 K! h1 \! t! k//取得标题/ Z. C1 Z4 K( X R0 W G7 `: `
//
+ e# ^- q7 k/ Jforeach(datacolumn col in dv.table.columns)
3 S' ?6 k) t4 L T{
# C% L$ ^) N) j- r( A4 ?, Acolindex++;
# y9 C# K- O- e" I. Uexcel.cells[4,colindex] = col.columnname;
9 X1 d& f8 D0 sxst.get_range(excel.cells[4,colindex],excel.cells[4,colindex]).horizontalalignment = xlvalign.xlvaligncenter;//设置标题格式为居中对齐
- j% n, B$ j) @7 J$ X: @: Q}
5 f4 O/ y' m/ z! T9 Q6 U* d5 i//
" F& c/ e4 |8 I4 W9 h$ x' r//取得表格中的数据! _, A. K& Q! V' f3 L
//
0 `5 c' i$ T, b& M9 @foreach(datarowview row in dv)
7 p4 i) G9 K& _" |{: B1 l) X( h, h
rowindex ++;
. i' e3 C) D! K$ G* `5 mcolindex = 1;
/ Y. w# w& j3 n" b* L$ N1 Tforeach(datacolumn col in dv.table.columns)
. h D3 H3 l. B- Y8 s u{9 |4 U6 w2 J! T# a
colindex ++;* I. G0 E0 x" P/ w2 z
if(col.datatype == system.type.gettype(system.datetime)), |1 U, R. l( F; z
{
; h* t" i- H! \4 @excel.cells[rowindex,colindex] = (convert.todatetime(row[col.columnname].tostring())).tostring(yyyy-mm-dd);
/ K( @/ {+ V1 e6 `, ]xst.get_range(excel.cells[rowindex,colindex],excel.cells[rowindex,colindex]).horizontalalignment = xlvalign.xlvaligncenter;//设置日期型的字段格式为居中对齐
% x7 c1 V J5 t4 v% d}5 H. O' |; Y6 Y7 y2 n0 d3 S
else; m$ f$ \6 |: @+ w' Z+ G, s
if(col.datatype == system.type.gettype(system.string))7 U9 V6 T. U& A5 T, e8 y$ j. p- P
{
* ^8 X: b9 M. m2 D! ]& rexcel.cells[rowindex,colindex] = '+row[col.columnname].tostring();
' U! G7 r( o9 j1 M) p& j( V0 O. Hxst.get_range(excel.cells[rowindex,colindex],excel.cells[rowindex,colindex]).horizontalalignment = xlvalign.xlvaligncenter;//设置字符型的字段格式为居中对齐
% M$ v% y4 L+ x/ }}' }( g+ L8 \' V, \4 i: R
else9 y6 I! {# q1 _$ [
{3 T z: C" K7 f$ o
excel.cells[rowindex,colindex] = row[col.columnname].tostring();
, i$ j. @" u$ o% [. S' \2 O}
# H; \: ]3 l4 j* D1 Z+ U}+ |3 W% `# g$ E2 i8 z+ z
}
) p6 |# Y9 o9 p; m& Y//
$ \6 s) T$ U8 {9 A9 h* Y4 o, J//加载一个合计行" x, k% v# i2 J+ s# X
//
, ^; X6 I7 J6 z O" F Gint rowsum = rowindex + 1;
% _4 e) G# m8 H+ iint colsum = 2;% M' e! @$ v% f- B; B* d' L
excel.cells[rowsum,2] = 合计;
7 ]8 j% Q/ T; B6 _ `3 L# s5 _$ txst.get_range(excel.cells[rowsum,2],excel.cells[rowsum,2]).horizontalalignment = xlhalign.xlhaligncenter;* Q" [1 r( v9 `$ K
//" n- l+ T. f0 O: K3 d4 F
//设置选中的部分的颜色
6 b( q; [+ e; U//
* E" ]$ g0 R4 U6 N. t7 M$ w: exst.get_range(excel.cells[rowsum,colsum],excel.cells[rowsum,colindex]).select();
) w" M! [6 n4 F8 Z' e+ zxst.get_range(excel.cells[rowsum,colsum],excel.cells[rowsum,colindex]).interior.colorindex = 19;//设置为浅黄色,共计有56种& `" O! |/ @( W/ a: S
//" G O2 o; B6 l" x5 n
//取得整个报表的标题
1 w' c4 x. Q0 j5 n% K$ b5 S//+ D& J/ o2 ]$ [5 |3 p
excel.cells[2,2] = str;
2 s/ U9 B9 O! x$ r/ w//* t/ S2 k# r; C6 k# P/ e
//设置整个报表的标题格式
' a. j5 X7 q5 Z//
! |& H4 _9 j; \9 L2 Exst.get_range(excel.cells[2,2],excel.cells[2,2]).font.bold = true;
6 W2 R `: `1 [+ M3 yxst.get_range(excel.cells[2,2],excel.cells[2,2]).font.size = 22;1 c) i6 D5 R1 _* j; n
//
3 W: e6 E/ @; }3 W- p+ C//设置报表表格为最适应宽度7 B' x7 D3 N6 g# c5 @; `: N
//
6 x0 |- F& W" v: j( Exst.get_range(excel.cells[4,2],excel.cells[rowsum,colindex]).select();
1 m( I5 Z: q6 d }xst.get_range(excel.cells[4,2],excel.cells[rowsum,colindex]).columns.autofit();
; G' m4 K b1 S//
. m+ ?4 {: U7 s6 T k//设置整个报表的标题为跨列居中& r( z2 l0 K6 ^% c
//
1 g( H4 R4 i$ ^+ H3 |xst.get_range(excel.cells[2,2],excel.cells[2,colindex]).select();
% L, n/ e2 f! D* Q$ c$ v( hxst.get_range(excel.cells[2,2],excel.cells[2,colindex]).horizontalalignment = xlhalign.xlhaligncenteracrossselection;
! D+ N& H" Q1 D8 \//& l, C1 C( y3 B% f( o; f. C8 {
//绘制边框+ x4 q7 ^% {. p& H
//
- Z5 G) E4 {6 s% O5 X6 X, M8 k) exst.get_range(excel.cells[4,2],excel.cells[rowsum,colindex]).borders.linestyle = 1; r6 k/ K" Z9 `$ h; S9 n
xst.get_range(excel.cells[4,2],excel.cells[rowsum,2]).borders[xlbordersindex.xledgeleft].weight = xlborderweight.xlthick;//设置左边线加粗
* v9 H- O# B5 z: u4 V( G, \xst.get_range(excel.cells[4,2],excel.cells[4,colindex]).borders[xlbordersindex.xledgetop].weight = xlborderweight.xlthick;//设置上边线加粗
. k9 v& ?) O( I$ L. f2 x3 oxst.get_range(excel.cells[4,colindex],excel.cells[rowsum,colindex]).borders[xlbordersindex.xledgeright].weight = xlborderweight.xlthick;//设置右边线加粗) M, |) a. y5 N( s" U1 z
xst.get_range(excel.cells[rowsum,2],excel.cells[rowsum,colindex]).borders[xlbordersindex.xledgebottom].weight = xlborderweight.xlthick;//设置下边线加粗
0 J* S) b8 T, V% z4 v3 l: p7 { S//0 k& D; e, k* C. W
//显示效果
" ?6 R% L& ]1 ?, x//
1 j1 {9 N- q' a7 I0 S& k1 U2 G! ?excel.visible=true;
1 [) w p: y7 a( y( R, a- H3 F//xst.export(server.mappath(.)++this.xlfile.text+.xls,- ]; [( g: c' k5 \
sheetexportactionenum.ssexportactionnone,microsoft.office.interop.owc.sheetexportformat.ssexporthtml);
/ ]) @5 w; B# J! [8 pxbk.savecopyas(server.mappath(.)++this.xlfile.text+.xls);
, I% @- f) A, x; fds = null;# W6 k7 I1 I" `
xbk.close(false, null,null);
+ O+ H9 A1 f& ?1 Mexcel.quit();
! }5 {- A* O0 Rsystem.runtime.interopservices.marshal.releasecomobject(xbk);" A7 A; }% A( y' t
system.runtime.interopservices.marshal.releasecomobject(excel);
4 z9 Z3 i* T, u; }system.runtime.interopservices.marshal.releasecomobject(xst);
$ ~* Z/ [7 } N* uxbk = null;8 b" e1 U1 Z) E" X$ b- x# _
excel = null;) d$ l9 J5 G& O, D: B
xst = null; H3 h0 V5 A4 T; ~" _
gc.collect();
: K1 r) K- b* P# Z9 R; I5 w9 ^' ^string path = server.mappath(this.xlfile.text+.xls);
9 b' D5 z& k) z+ R( N' Q! {% dsystem.io.fileinfo file = new system.io.fileinfo(path);
+ R! K$ _3 ^6 Y1 m- x$ Dresponse.clear();+ d" A8 E: R) _) ?0 i$ |& [+ m
response.charset=gb2312;
% \% l% y3 L* d$ Z7 f, @$ Qresponse.contentencoding=system.text.encoding.utf8;
9 A0 w* \& Y- E0 `// 添加头信息,为文件下载/另存为对话框指定默认文件名) F4 f( ^ M) U. a
response.addheader(content-disposition, attachment; filename= + server.urlencode(file.name));/ \7 J* H$ j! \5 m
// 添加头信息,指定文件大小,让浏览器能够显示下载进度
7 T, B3 `- E& M1 k( h, uresponse.addheader(content-length, file.length.tostring()); a, M* A" M+ o2 s1 J
// 指定返回的是一个不能被客户端读取的流,必须被下载2 x/ r" b6 [- B/ [
response.contenttype = application/ms-excel;- X# X( ?7 w+ k
// 把文件流发送到客户端
2 r- y% x9 o1 S$ }. I' kresponse.writefile(file.fullname);+ v- y+ i: c7 g3 v
// 停止页面的执行1 Y7 F6 D2 e7 [- r! W' n0 J
response.end();
4 X4 k5 u6 F0 _5 N" P$ S}2 T9 F' ~6 |/ ?% H% C4 m" {0 _' S
导入、导出excel中的一些问题汇总# G3 l5 @) S: N
一、在项目中的添加引用:! [; H* u6 G2 X5 i
右击项目资源管理器的引用-->添加引用-->选择.net选项卡-->选择microsoft.office.interop.excel-->确定(如下图);
& X, X9 R* f( G! l% J; e: z在选择时注意一下.net组件的版本号,图是的12.0.0.0是office2007的版本:
' e; V. C3 F% ?二、在项目中使用microsoft.office.interop.excel:
& a' p6 \* p( O( _5 B6 }& s7 d9 G9 w如果想使用microsoft.office.interop.excel,首先需要在项目中引用命名空间:* ?6 \2 S0 N2 o+ d8 ^( i3 `8 U
using microsoft.office.interop.excel;
" ]( `( a% ?7 R& l. |& p: ?三、建立excel.application相关对象& g0 q" n+ W$ T5 `1 [7 S7 I2 Z
//建立application对象
- C8 t5 _. j# Z: S, n# Y& omicrosoft.office.interop.excel.application myexcel = new application();2 L& f: m, C' U. t0 z- A
//建立workbooks对象
# w3 G3 P( | k j; S; R! j' kworkbooks mybooks = myexcel.application.workbooks;
# Z& w! h* |1 L+ _+ j8 ~+ a8 a//建立一个system.reflection.missing的object对象
. g6 n: G K4 y. |; p1 w- ~object omissing = system.reflection.missing.value;
% ^7 g4 f1 M! r" L7 T, P% Z四、打开或新建excel的book文件
2 w5 M: v! R& y, L: h9 z5 ^( i//打开excel文件,注意里的“exccelfilepath”为excel文件在服务器上的物理地址,包括文件名6 _0 h, S5 |! p1 h# q8 B
workbook mybook = mybooks.open(exccelfilepath,omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing);
% m, V w" f* d6 g//新建workseet对象,,此处为要操作的工作表 ,当前要操作的工作表的获取方法有两种:使用工作表的索引值或使用工作表的名称,名称默认为:“sheet1”/“sheet2”等
( e+ A% Y' J( y u/ t8 Wworksheet mysheet = (worksheet)mybook.worksheets[1];
8 P) a+ P- E2 Y# s3 n' @//如果是新建excel工作簿,需要 设置如下两行内容,以保证工作簿中有一个工作表,! M# J- T# J2 C) a6 j9 Q
workbook workbook1 = excel1.workbooks.add(true);
& P: w2 ~7 R+ B8 N" f$ }7 Y, B) u. ]worksheet mysheet= (worksheet)workbook1.worksheets[sheet1];; j; Z/ p* O4 a/ ]* r
//设置excel对象是否显示界面,默认为false不显示界面
- i2 k! q8 K* ^6 L$ K& |9 Vmyexcel.visble=true;0 w/ ~" s1 L. ?, O
五、一些比较重要的针对excel的操作. J3 j+ o7 ~' H4 {
1、获取range对象
?4 ]$ [! `6 U$ ]% l5 T' N. T①、获取一个单元格的range对象:
: u# Y/ g: q6 `% A0 @1 }' C8 B+ c4 ]//选择第一行、第一列的单元的单元格为range对象) {- }: r; u4 J9 p$ T$ ]- w+ C
range r = (excel.range)mysheet.cells[1, 1];% K. q, f& v( I5 z3 W! }% t7 N% U
//选择多个连续的单元格为range对象
9 P& p* r& A) d7 zrange r=(excel.range)range.get_range(a1:f3)/ P! q5 N2 E( t2 y
②、给单元格赋值或取出单元格的值:
# K, m; s: n' s' h" f) D* I. E//已选择了range对象的赋值:, p) k# Y5 D7 Z* G
r.text=中国;# ^, ^6 }8 J# x: Z
//未选择range对象的赋值:) j4 X+ O" k( s$ w3 k2 }* J6 e
mysheet.cells[1,2].text=中国;
: g$ Z0 h+ `6 }7 v+ P1 l. r; t7 P//已选择了range对象的取值:8 T' W9 L, O1 U7 C9 @7 N
string strvalue= r.text; z# p+ p U3 T; d& Z8 b a
//未选择range对象的取值:2 I; W- k0 {) Q/ H! X
string strvalue= mysheet.cells[1,2].text;2 e. u/ x; G8 [; k- E1 Y4 |* A
③、给单元格设置边框
3 e" {, b& ]1 F. c: I% A" Kmysheet.cells[2, 1].borderaround(xllinestyle.xlcontinuous, xlborderweight.xlthin, xlcolorindex.xlcolorindexautomatic, null);//画线. `6 _" ]; f6 }2 |: q
④、合并单元格2 L9 B9 u @, v2 d
//合并单元格前先要将要合并的单元格选择为range对象2 L( q; \6 x, }' {! Y+ [
range r=range.get_range(a1:f3);
& P' G7 v# i; x. Y//然后现设置合并单元格+ x- Z- g) M" ~
r.mergecells = true;" L8 b6 X" u4 ^# C$ o; ]( e3 w
⑤、设置单元格的字体、字号、背景色等属性
; x' e5 P+ N) n* Smysheet.cells[1, 1].font.name = 黑体;! a7 ]2 y @7 A, d9 q
mysheet.cells[1, 1].font.size = 20;/ c5 p5 P+ H+ t4 m
mysheet.rows[1:1].rowheight = 40;7 p7 Z: h9 Q D, A' O
mysheet.cells[1, 1].interior.color = color.fromargb(224, 224, 224);//设置颜色& J6 `; K" M" I5 S
⑥、删除一行:
$ a: c2 z. S$ i6 n//首先获取要删除的行的range
3 Q3 d$ H& E+ @- G2 Y) pmicrosoft.office.interop.excel.range range = (microsoft.office.interop.excel.range)mysheet.rows[sendedrow[1], type.missing];
3 k- z' K" f+ V; j, C! F+ q//注意删除行后删除后的行号被下面的行替换,如果逐行删除,请先从最大的行号往最小的行号删除; `9 ~% ]( z$ W# q
range.delete(microsoft.office.interop.excel.xldeleteshiftdirection.xlshiftup);) j/ r& g9 Q, _& b) }
⑦、获取有数据的行数# J* _% D: c2 i3 `
int rowsint = mysheet.usedrange.cells.rows.count;+ x. }! k" n' O7 o4 B
六、excel文件的保存与退出
0 O* `! i/ b$ I+ {& b1 o, ?' n1、excel的保存与退出3 @0 `, A; i8 K/ w+ Q
mybook.save();* k& R% g; [" Q3 r
mybooks.close();
, l A4 }8 U- jmyexcel.quit();9 q2 ?0 F1 m! S5 R
2、excel指定文件保存
4 @ E" F7 L$ n; r% Imybook.close(true, filepath +_file_name, null);
6 i0 G P2 c: J$ ^7 K7 b七、释放excle对象的资源与结束excel 进程
) n2 }1 j; |) z4 ?3 S: R关于这方面内容有好多网友都在讲多种方法,经过本人实践,以下方面才能真正做到结束excel的任务进程:
+ B9 I2 Y2 f3 m" n% K) C1、将所有以上对excel的操作放到一个方法中,3 O2 x; l Q0 D! a0 u3 p
2、在操作excel后,即时将不使用对象一一释放并赋null值:
# ~1 |5 `/ S+ p! b0 m7 Z3 I" j4 Hsystem.runtime.interopservices.marshal.releasecomobject(mysheet);* _# `- f5 [8 g. k$ p
mysheet=null;
; Y% s& T w2 ?8 `. S9 t' isystem.runtime.interopservices.marshal.releasecomobject(mybook);
5 s8 q! v( U0 H5 N. Pmybook=null;//http://www.111cn.net# q2 b6 E- [! |9 L, V
system.runtime.interopservices.marshal.releasecomobject(mybooks);
3 d- h; j+ L6 Bmybooks=null;3 |! Y, ^2 ~ L
system.runtime.interopservices.marshal.releasecomobject(myexcel);
' p4 N+ m' x$ h5 z) g; m+ k1 Nmyexcel=null;( U2 |! k4 L) g9 ]- v" X
3、再新建一个方法,并以该方法中执行上面新建的操作excel方法,并在执行完操作excel方法的后面添加gc.collect():
; g; L; J7 A6 ^7 E//下面方法中outputexcel()方法是输出excel文件的对excel 操作的方法; S# G# Q1 g3 o! \0 {# a; q! {' E/ u
private void killexcel()
7 h- M9 s. I/ }! o7 `0 p{
! f: U" [# u6 voutputexcel();
. G, M- j$ G+ j& Z; hgc.collect();* d- K6 H4 t! z5 n. |) Y6 y+ ~
gc.waitforpendingfinalizers();
9 `* l% \3 W p( H% R4 ~}. V3 L+ ~6 S6 ~' O( _* B
好多网友都在介绍使用gc.collect()释放excel占用的资源来结束excel进行,如果将“gc.collect();”与操作excel的业务写在一个程序块中,“gc”是永远不能结束excel进程的,在web应用程序中,这种现象是很可怕的事情。原因是gc不会清理本程序块中的垃圾内存的。& [* n- I8 s* _; h B) I! r7 w0 r
4、在业务事件中调用killexcel()方法:- M; E, c4 \0 c% A
protected void linkbutton3_click(object sender, eventargs e)3 i6 X5 ^# Y! Y# b& h1 y
{/ T+ g6 |6 W* U7 x! e
//导出excel
$ S9 x1 ~( D8 q( D9 m3 W# }, okillexcel();
$ R( [9 F2 L8 ^# ~}1 T- v/ |3 P% [# q6 I) A8 ]2 U
八、一些权限的基本设置:
6 x$ @2 ]% d2 L9 g4 Z, t5 E: J使用以上方法在开发环境中调试程序没有一点问题,等发布到服务器上后,程序还是不能正常运行,需要进行如下的权限设置:% [, C _( |8 p% Q; j2 j, _
1、.net导出excel遇到的80070005错误的解决方法:( p: |% T' [5 k/ K- U% G6 R$ \
检索 com 类工厂中 clsid 为 {00024500-0000-0000-c000-000000000046}的组件时失败,原因是出现以下错误: 80070005基本上.net导出excel文件,都需要如此配置一下,不配置有的时候没错,而配置后基本应该不会出错。
- n! B5 \4 \$ ^2 s. ?2 R具体配置方法如下:
4 x# q* K% i$ P. I# m. y1:在服务器上安装office的excel软件.$ M+ e: P# _: J) x9 A
2:在开始->运行中输入dcomcnfg.exe启动组件服务
6 q" H* B+ u1 a0 {6 F3 B3:依次双击组件服务->计算机->我的电脑->dcom配置
; e( M' c! C0 T# p, f3 h9 K: t8 W0 }4:在dcom配置中找到microsoft excel 应用程序,在它上面点击右键,然后点击属性,弹出microsoft excel 应用程序属性对话框
/ ]3 d5 \+ d6 g9 ]9 M E/ L5:点击标识标签,选择交互式用户
. x$ b# K( u# {3 G& p: @8 L6:点击安全标签,在启动和激活权限上点击自定义,然后点击对应的编辑按钮,在弹出的安全性对话框中填加一个network service用户(注意要选择本计算机名),并给它赋予本地启动和本地激活权限.* Y1 p" z9 d6 s. O+ W. V g( a
7:依然是安全标签,在访问权限上点击自定义,然后点击编辑,在弹出的安全性对话框中也填加一个network service用户,然后赋予本地访问权限.
# O$ N2 I5 e2 Q+ }* o9 n8.如果交互式用户设置后出现错误8000401a,可取消交互式用户,指定为administratr,可暂时解决此问题。进一步的解决方式还有待探讨。
4 H8 E! L% r0 E. m9.采用第8点的设置后,打开excel可能会出现“无法使用对象引用或链接”,并且不能进行单元格粘贴。原因不明,取消设置后即可消失。
* F- T3 M" k1 o1 r J/ d' t2 x |以上是本人在近期作开发时的一点心得,现整理成文档,供奋战在程序开发一线的朋友共享,愿看到的网友能名帮助解决“无法使用对象引用或链接”的问题。
/ j/ {: q1 K0 P) {! W7 z) C3 c9 K& B: D' @* V! ~: o: u
更多网页制作信息请查看: 网页制作 |
|