1、由dataset生成& f% N6 | [; v2 Q0 [ Y. c1 I( J3 E
代码如下:
" ]9 l8 j& A4 J% F, H; B. Bpublic void createexcel(dataset ds,string typeid,string filename)$ D" X! I: f$ P# ?: A
{
5 m. ^9 F7 b2 h5 V4 chttpresponse resp;0 k( x3 L' ^/ H
resp = page.response;
' s ], \3 i: l* D& m! Yresp.contentencoding = system.text.encoding.getencoding(gb2312);
0 |2 M. b4 \/ C& Tresp.appendheader(content-disposition, attachment;filename= + filename);
" \& g8 A# x8 t U6 I9 Ystring colheaders= , ls_item=;
& y' P1 K/ x/ I4 L, Tint i=0;2 E) a# ~/ N# V
//定义表对象与行对像,同时用dataset对其值进行初始化9 [1 [. M$ P6 v: T7 ~# u& Z
datatable dt=ds.tables[0];
! x! V# @) K3 f3 _$ L& n4 W0 i# Ndatarow[] myrow=dt.select();
4 I* Y. R' x( G% }+ d( b// typeid==1时导出为excel格式文件;typeid==2时导出为xml格式文件/ D9 A/ ^% h: ^! t" q% [
if(typeid==1)) o H' e, \4 B' ~9 O
{$ s. a/ R& [. g9 I6 M C
//取得数据表各列标题,各标题之间以t分割,最后一个列标题后加回车符
+ j ~0 O: g' M" ~2 }, r+ y7 nfor(i=0;i colheaders+=dt.columns.caption.tostring()+t;% @) N& X& n% I: }& w3 O+ I( A) ]
colheaders +=dt.columns.caption.tostring() +n;. Z/ c5 T" ^! |' k, ^
//向http输出流中写入取得的数据信息, _0 I- {2 Y. D& E8 L, b8 F
resp.write(colheaders);
5 V+ Y+ ^! K+ a- y; G//逐行处理数据9 R( E' P6 O7 C1 g U
foreach(datarow row in myrow)
- I; s0 ]% c0 z; X( T{
/ K9 `/ Q: A! x2 ]2 b//在当前行中,逐列获得数据,数据之间以t分割,结束时加回车符n
1 m. G6 F4 V( w, `+ T6 @# W9 Mfor(i=0;i ls_item +=row.tostring() + t;
$ }& ]2 {$ {& X/ _) Uls_item += row.tostring() +n;, H' ]! h( ~! i7 D- ^
//当前行数据写入http输出流,并且置空ls_item以便下行数据4 p I$ f9 N; Q4 Q' E& j
resp.write(ls_item);( h$ T1 Y0 H e4 |
ls_item=;
8 a& }( u/ `1 {2 W} p6 K. }! G! r: r7 F. g: |1 n
}+ Q) G: O4 Q$ A6 V. p5 p% ^5 J
else
# \& g) [) h3 a& L{# B- X# P* a# ]2 q4 _3 j3 Y A
if(typeid==2)
9 M5 k( T4 n+ g" u{
0 ?. W$ S8 A* o5 e8 a//从dataset中直接导出xml数据并且写到http输出流中& ~. J2 I& d, x
resp.write(ds.getxml());' ]% n3 m% R( X6 U( K! c
}
( Q2 Q; b3 S( a& I}/ q2 E0 M! m# F$ Y1 m7 q. b7 a
//写缓冲区中的数据到http头文件中& D( ~& J r. X% D7 H/ |3 _
resp.end();
! Q3 L2 n. [& c}) P6 K- A0 b( c" a& B
2、由datagrid生成9 R# p8 G7 {- B; ~9 v( a* l
代码如下:8 U$ |: L- V# l
public void toexcel(system.web.ui.control ctl)( |, o" ^4 k. t7 M
{- i) u: h1 y, ~# P, p
httpcontext.current.response.appendheader(content-disposition,attachment;filename=excel.xls);
% m# r w/ P( ?- U( }: V+ Nhttpcontext.current.response.charset =utf-8;7 l0 H/ K" f' @
httpcontext.current.response.contentencoding =system.text.encoding.default;% L1 ` i( I9 S0 m! I
httpcontext.current.response.contenttype =application/ms-excel;//image/jpeg;text/html;image/gif;vnd.ms-excel/msword
* o& w' ~4 O/ U; ?* sctl.page.enableviewstate =false;
6 k, T' H% [! H- ~, w; j" Msystem.io.stringwriter tw = new system.io.stringwriter() ;
* g- t* S! g; l+ U# n4 N3 M$ osystem.web.ui.htmltextwriter hw = new system.web.ui.htmltextwriter (tw);. h) K0 ~/ \8 w0 o% E
ctl.rendercontrol(hw); o7 W8 A9 n, m: M" H
httpcontext.current.response.write(tw.tostring());
3 ^( y' q+ a$ b( P [4 ^/ ghttpcontext.current.response.end();
1 f4 g: C9 R/ O. y; Z}
$ q6 z2 S& v' s* P用法:toexcel(datagrid1);
' P3 z* j7 M, m3、这个用dataview4 d9 X" d* u; P9 r" d
代码如下:1 q& v8 v. F7 F
public void outputexcel(dataview dv,string str)2 I2 Z' e3 s2 J2 N0 h, Y2 _/ V$ b
{
9 n4 O2 Q4 Z( W//
) c8 D Q2 k0 H# H, w4 v# ]// todo: 在此处添加构造函数逻辑
2 L/ b' C2 y# N7 O//
, u$ Q" O/ G# L4 U: M( w//dv为要输出到excel的数据,str为标题名称) T. y( E, C C3 N7 o- l z' Q5 V
gc.collect();5 r! S; T7 [3 J. P; t, a
application excel;// = new application();
' w- f7 G+ {7 r3 U/ x1 u) pint rowindex=4;9 ]' u+ |$ ?- _9 C% l
int colindex=1;
- G: U: Y! ~# X! {. ?0 F_workbook xbk;4 ^0 d% q. |. ?# i
_worksheet xst;* D2 C9 W5 M% Z P
excel= new applicationclass();
, {4 ~* D# F& p2 \) t Zxbk = excel.workbooks.add(true);: G# L# P- D& ?) E8 g
xst = (_worksheet)xbk.activesheet;% k- H/ h0 R' D. ^; f6 m# @% [+ k
//
" G5 P3 N" n* j' F& v//取得标题! w9 }& j) |' j# w" i" N
//* A9 o- R- {( p5 D6 E
foreach(datacolumn col in dv.table.columns)6 W; L( o! G& L8 v* M R
{
P4 N$ L* V; y! O) i- V; ?4 Fcolindex++;
2 }! \4 B' b( W& V5 L4 Nexcel.cells[4,colindex] = col.columnname;8 v/ J$ ? e, }4 z& \, ~
xst.get_range(excel.cells[4,colindex],excel.cells[4,colindex]).horizontalalignment = xlvalign.xlvaligncenter;//设置标题格式为居中对齐3 t2 ^3 y H& h4 G( S
}! d% \/ M$ l6 Y0 f) \
//0 F8 x, a" u$ y/ D5 x1 D
//取得表格中的数据' r' O0 ]2 x- B1 P1 u
//
$ A) L+ X. u% Nforeach(datarowview row in dv)
' t. a8 x, x! O+ x4 `4 s b{
7 C( M/ ~3 i4 H, g, y/ yrowindex ++;
- I+ i7 r- T/ J3 ?' i Hcolindex = 1;' G" u6 @) C6 o' b
foreach(datacolumn col in dv.table.columns)
, Y' Y1 S" E2 ?+ Y6 q{
5 ~7 a/ K4 c* V# H) d% jcolindex ++;9 p2 q r/ [5 I+ j; C: F/ T8 v
if(col.datatype == system.type.gettype(system.datetime))9 v0 B5 ]; D% A2 }: Q! V# ?1 L' l
{! R& @. F+ s! W' t& `* v: P" r
excel.cells[rowindex,colindex] = (convert.todatetime(row[col.columnname].tostring())).tostring(yyyy-mm-dd);# s' _2 u/ _* R# a, W
xst.get_range(excel.cells[rowindex,colindex],excel.cells[rowindex,colindex]).horizontalalignment = xlvalign.xlvaligncenter;//设置日期型的字段格式为居中对齐
7 n8 S" R% E# D2 I. G. ]5 _} k9 v# h, K9 Y
else
5 O. B$ |( H( ~7 Tif(col.datatype == system.type.gettype(system.string))( U' h. b! s2 D& H3 ~- i0 p
{& S0 r P% ]0 A, w5 @) Q E. w
excel.cells[rowindex,colindex] = '+row[col.columnname].tostring();
& h2 b8 A, W( F0 D( n; vxst.get_range(excel.cells[rowindex,colindex],excel.cells[rowindex,colindex]).horizontalalignment = xlvalign.xlvaligncenter;//设置字符型的字段格式为居中对齐) j! d$ t8 [8 d, L" q% e4 i
} k2 w; I; Q/ ?, e, o: g2 U
else
h; b, P" @9 w$ B1 U: X{
0 O# {/ i N4 P3 k8 Hexcel.cells[rowindex,colindex] = row[col.columnname].tostring();
# E& p# [0 x1 l; F4 V) u. v6 `1 d% i& |}/ d" K! D: f% g
}9 l* h/ w8 o# H d& s+ @4 C& P
}
) P7 w$ e3 a4 V$ X//& @& f3 v) }# b* t- Z+ a
//加载一个合计行
" ?4 E ]1 ?4 @* Z% r' z$ \( X) i n//
/ T2 Z6 k9 Q% h! |' ^) jint rowsum = rowindex + 1;
: L3 v+ B8 _' G1 I+ @int colsum = 2;+ w8 W. F/ E3 i; \4 f! x) J F
excel.cells[rowsum,2] = 合计;7 v( `; o# W' w) t2 o+ q" g% B
xst.get_range(excel.cells[rowsum,2],excel.cells[rowsum,2]).horizontalalignment = xlhalign.xlhaligncenter;
8 [# u {- Z( ^9 s//) s) h3 o! W; U' ~ G: t( f
//设置选中的部分的颜色; p; a% W1 ]7 g g6 o
//
% T- w N( b8 x! y' Exst.get_range(excel.cells[rowsum,colsum],excel.cells[rowsum,colindex]).select();
! K: } y8 u& ]! p/ Fxst.get_range(excel.cells[rowsum,colsum],excel.cells[rowsum,colindex]).interior.colorindex = 19;//设置为浅黄色,共计有56种7 G; w+ F0 R9 N. l
//
6 R5 H, @2 @) R' s9 V//取得整个报表的标题 D+ o/ w* Z& L7 `" x7 G, T: | W4 U: k
//: f. X( N0 a& w; x& y
excel.cells[2,2] = str;
$ C/ S4 S+ B, \. H9 m//
0 W* \6 s' H! z- o0 U//设置整个报表的标题格式- f, ^4 `* |2 P+ M
//
. r( j$ ]& o5 N% k( fxst.get_range(excel.cells[2,2],excel.cells[2,2]).font.bold = true;5 _' }2 j" J9 ]& Y
xst.get_range(excel.cells[2,2],excel.cells[2,2]).font.size = 22;1 [' f! U# O# H
//
8 P- ?. z6 u6 [7 r E//设置报表表格为最适应宽度# w L4 u9 W/ o
//- \' r/ N0 v! }. ?# o
xst.get_range(excel.cells[4,2],excel.cells[rowsum,colindex]).select();
; L8 `1 t0 z3 A+ P' x# Z1 Axst.get_range(excel.cells[4,2],excel.cells[rowsum,colindex]).columns.autofit();
g$ b3 \" h% V$ b! d8 \//, b3 I. H/ t/ Q
//设置整个报表的标题为跨列居中
z" t: l) e( a0 I//
$ _0 m" E0 O$ G6 v- S5 K0 g. Sxst.get_range(excel.cells[2,2],excel.cells[2,colindex]).select();
# C R' E7 R/ ?; {1 K2 ^5 D" Jxst.get_range(excel.cells[2,2],excel.cells[2,colindex]).horizontalalignment = xlhalign.xlhaligncenteracrossselection;" ~7 W: q8 K% e( h; E( N0 k
//
1 \( s g% s: G4 i//绘制边框0 o3 G( ]3 d5 w
//
1 q( l: \- T9 jxst.get_range(excel.cells[4,2],excel.cells[rowsum,colindex]).borders.linestyle = 1;& E0 ?3 g! n* T1 Z) F. F( }
xst.get_range(excel.cells[4,2],excel.cells[rowsum,2]).borders[xlbordersindex.xledgeleft].weight = xlborderweight.xlthick;//设置左边线加粗
: Y9 z3 u n" _/ ?, A. Y. I* g+ sxst.get_range(excel.cells[4,2],excel.cells[4,colindex]).borders[xlbordersindex.xledgetop].weight = xlborderweight.xlthick;//设置上边线加粗' ~/ B8 y* _$ p! C0 L9 N
xst.get_range(excel.cells[4,colindex],excel.cells[rowsum,colindex]).borders[xlbordersindex.xledgeright].weight = xlborderweight.xlthick;//设置右边线加粗
/ c$ K) ~: w* ?! |! L I9 e* G( b( qxst.get_range(excel.cells[rowsum,2],excel.cells[rowsum,colindex]).borders[xlbordersindex.xledgebottom].weight = xlborderweight.xlthick;//设置下边线加粗- M7 V5 @- N7 j7 h# B
// Z: p4 g ? Q7 y
//显示效果
+ r+ ?9 s; H5 e) q, V% g) @# _5 I//* K5 L! U! g" I
excel.visible=true;& [( k- @( Y# B' O$ o3 l
//xst.export(server.mappath(.)++this.xlfile.text+.xls,. W/ b& Q- L$ E4 u5 J/ z. ^8 g
sheetexportactionenum.ssexportactionnone,microsoft.office.interop.owc.sheetexportformat.ssexporthtml);# C# _3 p+ K( c' J! i* f
xbk.savecopyas(server.mappath(.)++this.xlfile.text+.xls);
3 X! C. N8 R- s0 Ids = null;6 I7 q$ D) n: C# `6 c, m. j
xbk.close(false, null,null);# L7 q, p6 l9 _" E
excel.quit();
- u6 w- d6 B8 k. c+ @; ^system.runtime.interopservices.marshal.releasecomobject(xbk);
3 Q5 _ X, Y; lsystem.runtime.interopservices.marshal.releasecomobject(excel);# P0 S4 B7 L2 H1 _& l
system.runtime.interopservices.marshal.releasecomobject(xst);
" u. g6 Q3 F! g8 l1 |" ?xbk = null;
. N0 s& l) n g) [$ \" }1 S" x( sexcel = null;4 v# {! }6 v; ^2 D
xst = null;8 w. V* T+ X: K3 S7 h
gc.collect();
. g3 c; ^! D4 t, \* Zstring path = server.mappath(this.xlfile.text+.xls);
3 }# p1 n1 T6 _% @6 psystem.io.fileinfo file = new system.io.fileinfo(path);
# J8 @6 h1 X7 e* ? b- Mresponse.clear();" _6 J! F$ n7 ^8 S5 n4 z% S: \
response.charset=gb2312;. h, \; m) v4 T- r0 h/ @. J
response.contentencoding=system.text.encoding.utf8;
7 w; j1 C4 {4 I; q3 M( {7 g% j// 添加头信息,为文件下载/另存为对话框指定默认文件名
. z* L+ Z4 [' l! rresponse.addheader(content-disposition, attachment; filename= + server.urlencode(file.name));, I, Z; K6 Y$ x' S3 g- m5 C
// 添加头信息,指定文件大小,让浏览器能够显示下载进度
. p! _2 g5 w; E9 C! v4 {, B1 Zresponse.addheader(content-length, file.length.tostring()); l6 M& H/ m9 D* p* _* y; R
// 指定返回的是一个不能被客户端读取的流,必须被下载
0 u! X& W n; |1 O" Z9 ~response.contenttype = application/ms-excel;. [% A! ~: R+ c9 ~! r+ C
// 把文件流发送到客户端. y# C9 }) l, R! \: [
response.writefile(file.fullname);
9 R# i. _2 l& {$ Z// 停止页面的执行/ M5 m2 v8 Q7 I" W2 L @
response.end();
: ~; k9 V3 H" N* y! ]8 D! [1 G0 \5 p}
, n/ m {' O0 {2 M9 L导入、导出excel中的一些问题汇总
4 k3 o! G8 u9 n- Y5 f* [一、在项目中的添加引用:7 t ^) A4 V5 K8 [, G" K4 c# S
右击项目资源管理器的引用-->添加引用-->选择.net选项卡-->选择microsoft.office.interop.excel-->确定(如下图);0 D2 |7 P) z8 x+ K8 r- ^
在选择时注意一下.net组件的版本号,图是的12.0.0.0是office2007的版本:. d- T d/ o- `3 X9 }2 Q, j# q
二、在项目中使用microsoft.office.interop.excel:
5 L. y$ H+ T# o1 c# H如果想使用microsoft.office.interop.excel,首先需要在项目中引用命名空间:
6 a8 p# M6 m9 p% l7 O. Dusing microsoft.office.interop.excel;: S+ t* u( }5 X
三、建立excel.application相关对象/ Z2 g/ o) a2 ~- E2 ~
//建立application对象# X8 Q2 e( @' U0 x+ D6 F2 Y
microsoft.office.interop.excel.application myexcel = new application();
. W7 X9 A E1 z//建立workbooks对象9 w b+ P1 Z0 V) R+ f
workbooks mybooks = myexcel.application.workbooks;7 X9 m& i( f; j+ k& n- O
//建立一个system.reflection.missing的object对象
( O8 R3 \8 Q2 T lobject omissing = system.reflection.missing.value;2 P$ p2 r5 C* A/ J3 z+ R& V0 l0 d2 X
四、打开或新建excel的book文件
# V a1 o, `! x//打开excel文件,注意里的“exccelfilepath”为excel文件在服务器上的物理地址,包括文件名, j( b" M9 L) u5 m& }
workbook mybook = mybooks.open(exccelfilepath,omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing);
) _9 N( g0 p% t7 Y: b//新建workseet对象,,此处为要操作的工作表 ,当前要操作的工作表的获取方法有两种:使用工作表的索引值或使用工作表的名称,名称默认为:“sheet1”/“sheet2”等
. b) ]2 d3 _- h( f& R9 h* \$ F' `worksheet mysheet = (worksheet)mybook.worksheets[1];: s9 w) W& E) }2 S
//如果是新建excel工作簿,需要 设置如下两行内容,以保证工作簿中有一个工作表,) k: @4 ]$ T& ?7 c. F
workbook workbook1 = excel1.workbooks.add(true);1 H) ]* T( B5 \( g" S0 O
worksheet mysheet= (worksheet)workbook1.worksheets[sheet1];2 K& a; s1 M; S$ _( C
//设置excel对象是否显示界面,默认为false不显示界面8 o( }5 D4 j( P3 w% G
myexcel.visble=true;# z$ ^6 [8 d3 }& B4 p2 `
五、一些比较重要的针对excel的操作0 u$ L3 z0 U$ B2 \: G8 T
1、获取range对象& \ @) c8 @7 U, a8 ~0 c. }) H
①、获取一个单元格的range对象:, j) l K$ B+ B" y: g {! ?, ^8 m; ^
//选择第一行、第一列的单元的单元格为range对象
( C$ u$ n# H! n: \3 k& u: q* \range r = (excel.range)mysheet.cells[1, 1];, P4 I9 i6 |% J' u
//选择多个连续的单元格为range对象
' g5 J/ ?( m$ Q5 D, q' ]range r=(excel.range)range.get_range(a1:f3)
: x2 t# [. B' ]②、给单元格赋值或取出单元格的值:
4 R- K( \/ W; h Z2 R% d- `7 ?' W. }//已选择了range对象的赋值:
* `$ E! @0 ~! ~+ Ar.text=中国;& P3 g+ |& A1 g6 c
//未选择range对象的赋值:
6 R. w# ?$ o. s0 w+ y9 {! Zmysheet.cells[1,2].text=中国;0 X& w' I% d" h" h' n; ]! q% o/ N
//已选择了range对象的取值:
7 B4 r+ I h% }' Z. u/ Z4 ustring strvalue= r.text;
" u8 D1 Q2 J' c5 m7 s% P; N//未选择range对象的取值:
: a" ]4 `% z- }+ z' Q0 Zstring strvalue= mysheet.cells[1,2].text;
9 U+ U/ X8 ? a0 s1 R- {③、给单元格设置边框9 t; ~9 E/ C7 `1 p* t# J* m
mysheet.cells[2, 1].borderaround(xllinestyle.xlcontinuous, xlborderweight.xlthin, xlcolorindex.xlcolorindexautomatic, null);//画线
/ r4 j* S! e8 u6 Q5 ]' ~1 y( o④、合并单元格; e( E) V) ^8 x% W T% L
//合并单元格前先要将要合并的单元格选择为range对象! V/ n4 }/ l D. R
range r=range.get_range(a1:f3);$ I# s! |0 i9 z8 X& r+ A3 {
//然后现设置合并单元格
! {, Y2 P# m2 u1 W& Xr.mergecells = true;" e6 j3 ~9 y9 \. i( z1 O2 N! i. V5 E- b$ M
⑤、设置单元格的字体、字号、背景色等属性* X9 f# ^( C8 C
mysheet.cells[1, 1].font.name = 黑体;
- J% _. F2 {2 k! |$ W/ B6 Emysheet.cells[1, 1].font.size = 20;7 M/ O; | a5 A4 o! i/ ]
mysheet.rows[1:1].rowheight = 40;5 e9 T: }8 p3 O* v' E; R
mysheet.cells[1, 1].interior.color = color.fromargb(224, 224, 224);//设置颜色
0 j: |$ }. x. b! I: d- g⑥、删除一行:
' |4 F* o: ~( n6 J//首先获取要删除的行的range
/ w. c- F/ ?! W6 o2 Y, |+ Hmicrosoft.office.interop.excel.range range = (microsoft.office.interop.excel.range)mysheet.rows[sendedrow[1], type.missing];
2 a+ t; n% k# e/ l% X//注意删除行后删除后的行号被下面的行替换,如果逐行删除,请先从最大的行号往最小的行号删除
3 ` S5 v1 t9 t& S# ] D* W- \1 {3 Orange.delete(microsoft.office.interop.excel.xldeleteshiftdirection.xlshiftup);
1 D, U m' Q+ t8 M0 R8 X: e⑦、获取有数据的行数4 q. m8 ]" k0 k# g5 q( @$ j5 P
int rowsint = mysheet.usedrange.cells.rows.count;
7 ]# B; u3 z4 }1 {! J0 o六、excel文件的保存与退出
( P# Z4 `1 \& W8 |, }. q! J1、excel的保存与退出5 L- \: |$ Q/ I8 u- d4 m+ y
mybook.save();
) j; ?" J+ c* r+ L' y# U+ T. s& ]mybooks.close();
- ?5 [% \% r2 J+ ?; Nmyexcel.quit();
1 {7 ?/ c; p" p# H0 ~2、excel指定文件保存/ Q6 ~ S$ J8 I2 M# i, [
mybook.close(true, filepath +_file_name, null);) t* N; S: M* d- u
七、释放excle对象的资源与结束excel 进程4 Z) n$ M) n7 L0 y/ x1 I' w, I- S I
关于这方面内容有好多网友都在讲多种方法,经过本人实践,以下方面才能真正做到结束excel的任务进程:
- t7 U& z/ c$ ]$ G1、将所有以上对excel的操作放到一个方法中,
5 p, d) Y3 @5 C6 w+ c* L2、在操作excel后,即时将不使用对象一一释放并赋null值:, O8 U6 B; W5 p+ l: t' W6 ?" p
system.runtime.interopservices.marshal.releasecomobject(mysheet);8 C4 x& E2 ]8 ^# N. }; L
mysheet=null;# M, I0 Y' t6 Y5 H
system.runtime.interopservices.marshal.releasecomobject(mybook);
7 N5 S1 t& j4 E( g7 |mybook=null;//http://www.111cn.net: P) u4 O& V' R
system.runtime.interopservices.marshal.releasecomobject(mybooks);
6 P* j: o- [4 D! [" fmybooks=null;! @# |4 w; P2 b6 V- l
system.runtime.interopservices.marshal.releasecomobject(myexcel);* p1 I! W! r: W! s
myexcel=null;
0 V% Z! [% t, O5 ~3 g% y3 a3、再新建一个方法,并以该方法中执行上面新建的操作excel方法,并在执行完操作excel方法的后面添加gc.collect():' Y- Z) k7 Y0 F1 E# m0 C$ w
//下面方法中outputexcel()方法是输出excel文件的对excel 操作的方法! H+ [) l+ I9 a
private void killexcel()5 Q$ o) `7 g: h8 U* P
{
( G- ^& u. N$ |+ toutputexcel(); U, W% r+ }6 ~% L( R" W
gc.collect();0 W6 `" ?4 t5 o8 w# |, B
gc.waitforpendingfinalizers();9 Q0 _9 ?0 d6 y; e
}
1 _- b: ^+ x5 ^; \* a好多网友都在介绍使用gc.collect()释放excel占用的资源来结束excel进行,如果将“gc.collect();”与操作excel的业务写在一个程序块中,“gc”是永远不能结束excel进程的,在web应用程序中,这种现象是很可怕的事情。原因是gc不会清理本程序块中的垃圾内存的。
3 z* x- H- y- R/ d" F( x4、在业务事件中调用killexcel()方法:
) ]+ k a+ B- R* Q# m. q( e% J; O2 Bprotected void linkbutton3_click(object sender, eventargs e)
4 C1 J% u' u( f5 q2 O; h8 w{
3 D2 Z' D! a# P0 b( t N//导出excel
) |# E3 i+ T, h' _* Q+ q& j& Vkillexcel();, G3 k. i6 }7 I7 U* ?' r O
}, }$ q7 N% ~; G
八、一些权限的基本设置:% G+ L( y o. g. C9 Y
使用以上方法在开发环境中调试程序没有一点问题,等发布到服务器上后,程序还是不能正常运行,需要进行如下的权限设置:7 d+ C4 A& T' _+ h: S
1、.net导出excel遇到的80070005错误的解决方法:" i( y! G0 g4 M1 R0 E7 _
检索 com 类工厂中 clsid 为 {00024500-0000-0000-c000-000000000046}的组件时失败,原因是出现以下错误: 80070005基本上.net导出excel文件,都需要如此配置一下,不配置有的时候没错,而配置后基本应该不会出错。
X8 v3 T% x- W* [8 n% T: n具体配置方法如下:% ?, q* d& ]5 _# K$ A& A, S, Y
1:在服务器上安装office的excel软件.
$ @ V) f9 h; n j2:在开始->运行中输入dcomcnfg.exe启动组件服务1 z! d. V% O2 N
3:依次双击组件服务->计算机->我的电脑->dcom配置
8 a' Q! ~1 F0 k* m& E4:在dcom配置中找到microsoft excel 应用程序,在它上面点击右键,然后点击属性,弹出microsoft excel 应用程序属性对话框
9 b4 V3 q# C- [# T" F5:点击标识标签,选择交互式用户
6 e4 M2 \0 N1 p8 i6:点击安全标签,在启动和激活权限上点击自定义,然后点击对应的编辑按钮,在弹出的安全性对话框中填加一个network service用户(注意要选择本计算机名),并给它赋予本地启动和本地激活权限.: j, c0 R) s9 @0 W
7:依然是安全标签,在访问权限上点击自定义,然后点击编辑,在弹出的安全性对话框中也填加一个network service用户,然后赋予本地访问权限.
0 k% _" a4 I" M# a7 l! ~: I: f" t# L8.如果交互式用户设置后出现错误8000401a,可取消交互式用户,指定为administratr,可暂时解决此问题。进一步的解决方式还有待探讨。
7 f e: `( @! Y, S9.采用第8点的设置后,打开excel可能会出现“无法使用对象引用或链接”,并且不能进行单元格粘贴。原因不明,取消设置后即可消失。: n8 j' k0 u0 E0 T3 U* f- _! {
以上是本人在近期作开发时的一点心得,现整理成文档,供奋战在程序开发一线的朋友共享,愿看到的网友能名帮助解决“无法使用对象引用或链接”的问题。
+ ?5 ^# \% G0 W1 f. j0 G4 W+ h# w+ M O, j: E) q0 G
更多网页制作信息请查看: 网页制作 |
|