返回列表 发新帖

asp.net中导出excel数据的方法汇总

364.2k 10
swmozowtfl 发表于 2015-7-18 00:12:19|湖北 | 查看全部 阅读模式
1、由dataset生成
$ W! v" C# _- G! N/ T/ Z代码如下:
' i0 N) f7 v# }  C$ u% A) O7 _0 T# T
public void createexcel(dataset ds,string typeid,string filename)
! Y9 H( n/ [  \0 X8 C# A1 o* d{
: M& W4 n3 }- p; ^( ?! jhttpresponse resp;
, h7 P6 ^& e$ G3 @7 X& |resp = page.response;
" |% `# z) b& {9 Hresp.contentencoding = system.text.encoding.getencoding(gb2312);6 v1 `/ [9 A: v- s
resp.appendheader(content-disposition, attachment;filename= + filename);( j5 d  Y1 r5 c4 E
string colheaders= , ls_item=;
5 Y! x, e  t( }; k: K& ?, X2 Oint i=0;4 U( D+ R% l6 L. B8 x
//定义表对象与行对像,同时用dataset对其值进行初始化
2 N9 u; J$ k' |! g, Fdatatable dt=ds.tables[0];
3 q9 \  M8 _9 ^' Kdatarow[] myrow=dt.select();9 S* d# n5 W8 `( H7 O' k2 g
// typeid==1时导出为excel格式文件;typeid==2时导出为xml格式文件7 \% w" x0 a0 j1 u2 f+ _" d
if(typeid==1)
& Q  v+ J+ j7 i6 d, o" l8 F4 n  p{
# D, ~- P1 f; X) D/ Q//取得数据表各列标题,各标题之间以t分割,最后一个列标题后加回车符
% @. U3 k+ p, V4 z; o, o+ ~for(i=0;i colheaders+=dt.columns.caption.tostring()+t;) W9 v. O2 t3 Z9 M& _8 u" u
colheaders +=dt.columns.caption.tostring() +n;' `" g5 s1 |8 J% n8 N
//向http输出流中写入取得的数据信息
' f6 ~3 B. E3 \& U# R" X: Bresp.write(colheaders);
0 U9 ^1 D  X- Z- z# P" J//逐行处理数据4 m/ T# @( t( S
foreach(datarow row in myrow)8 [, n& H/ {$ D% T+ I0 o
{
3 @' P6 D# a4 n, x! s( |* z6 _* D//在当前行中,逐列获得数据,数据之间以t分割,结束时加回车符n
1 ^& d$ o1 H# H7 S' t; R% vfor(i=0;i ls_item +=row.tostring() + t;
( H7 j: D! F( e6 C- q$ ~ls_item += row.tostring() +n;* L# Q1 o0 u% W- G8 ~' G: g) v. _
//当前行数据写入http输出流,并且置空ls_item以便下行数据
, V' N2 H+ H; t" U# |resp.write(ls_item);
+ I* C" ?+ d0 g2 n8 |  o  ols_item=;1 D4 ?. F: x$ p4 H: s
}
) C1 C6 j2 o5 Q" [4 E6 M}
: `& @* O% Y! e( d7 ]3 m6 Melse
3 ?- i3 N6 o  [8 Q+ `* i5 M{3 A/ d7 X& n8 ?  e
if(typeid==2)
& B/ [" [% ]9 E& S$ W4 Z( @  {  t{
) o( X: J4 ]' n9 \# S3 J# m1 X0 G//从dataset中直接导出xml数据并且写到http输出流中2 R) y2 e  i2 H) v( d: `
resp.write(ds.getxml());5 |1 }  G% Q9 W6 x, Z) v8 [+ a" K
}
& `2 m3 N1 Q# U) m; a! H# h}+ J( ~- o. J8 Y) W" r
//写缓冲区中的数据到http头文件中
6 x1 L" {, V( t+ ^$ ]& Z: S* jresp.end();8 F+ |* `2 h4 r  `" D, \1 a9 q% u
}
* A& o2 [7 Y0 u+ A. I3 s2、由datagrid生成
5 R. ^6 l7 w1 Z  J0 Y  L代码如下:5 Y6 q& @% h! y) ?3 X
public void toexcel(system.web.ui.control ctl)
! V' o$ S& o# U& s+ \{
% ~7 `4 \4 J. P) x) y! v9 Hhttpcontext.current.response.appendheader(content-disposition,attachment;filename=excel.xls);
1 q: s/ ?: T. Y* _0 J# Shttpcontext.current.response.charset =utf-8;: j$ U; B. D: @0 ^5 V
httpcontext.current.response.contentencoding =system.text.encoding.default;& Z. [( v8 D' C
httpcontext.current.response.contenttype =application/ms-excel;//image/jpeg;text/html;image/gif;vnd.ms-excel/msword
5 y7 ~+ M) @4 Z2 {5 a" h* hctl.page.enableviewstate =false;9 t; o5 s  B# d2 y
system.io.stringwriter tw = new system.io.stringwriter() ;
4 T- h" j5 a3 x  lsystem.web.ui.htmltextwriter hw = new system.web.ui.htmltextwriter (tw);$ f7 o9 S0 B6 Y1 u
ctl.rendercontrol(hw);" a, Z2 g! }) [, X; _
httpcontext.current.response.write(tw.tostring());
3 Y/ @; d6 a. o% phttpcontext.current.response.end();: ]8 ]  Z& A' k+ O# @0 m! U
}( f+ m' Y1 u$ l; l
用法:toexcel(datagrid1);
  |7 ]4 d, _' S4 o7 M3、这个用dataview
+ q0 j3 F0 l  ]/ u; y, c代码如下:
' {/ s! F3 i( S% K1 L9 d8 z/ ~1 \
public void outputexcel(dataview dv,string str)
3 |  O& R. U1 X  [( j{
+ I: J- k* R+ R- N( D0 X//" \& ~2 Y9 c; z. Z' G2 y9 \
// todo: 在此处添加构造函数逻辑6 ]  R* ]! G! D9 L) y1 j: ?
//4 F$ n5 F9 q/ ?+ {
//dv为要输出到excel的数据,str为标题名称
5 ?7 Z1 h3 q/ M1 }) s( }gc.collect();
1 ^1 L5 U" m4 `! ~application excel;// = new application();
! |5 W7 u" @  ?' Bint rowindex=4;
! f4 e/ q; k: @: W  I: P6 b4 Oint colindex=1;2 U& Y; j5 X  h/ V
_workbook xbk;
) A5 U" C3 S9 }. c, u; u( f_worksheet xst;
$ c. @4 _, F6 V$ E0 |) }- d) P; zexcel= new applicationclass();. X) [1 g4 I2 n: X
xbk = excel.workbooks.add(true);
# k( I' v+ f0 z8 L- ~xst = (_worksheet)xbk.activesheet;
/ W9 a1 u" Y/ ~/ H( W1 b//
! u* Z. L: i1 S5 O//取得标题
. G+ j; B9 C% n//
5 j9 o( t; u' hforeach(datacolumn col in dv.table.columns)8 M: b- v$ g! J- L% E8 u' F
{
; X, S% ?+ ?& W/ b( U- Acolindex++;
! v2 X6 `/ c6 w. L. T  Q+ A, R, Pexcel.cells[4,colindex] = col.columnname;
' R) n3 W4 k& P% Z/ y- Axst.get_range(excel.cells[4,colindex],excel.cells[4,colindex]).horizontalalignment = xlvalign.xlvaligncenter;//设置标题格式为居中对齐
7 m+ v& ?! P" [( _4 u}0 \0 h) E& t  O. ?; t
//
2 y* a+ s0 ^0 y//取得表格中的数据6 [) D4 y" [& i8 H8 ^3 [& N. t
//
+ Y) e" \( T! Y5 j% R! ^foreach(datarowview row in dv)9 l* z. X, S; E: `, N
{
* r+ k0 X  ^6 arowindex ++;
2 i" u# @- f, ]; i: ?- Z4 O6 Ccolindex = 1;2 o* ?7 A8 j, x, Y
foreach(datacolumn col in dv.table.columns)
, o5 j  F( p  w& a{$ z* A, e* H7 I* [3 Z
colindex ++;
9 p& x  `# l" o( J2 Q8 oif(col.datatype == system.type.gettype(system.datetime))
0 E! ]0 h, U* l( V/ k  j+ ^{$ ~0 ?0 V7 Y& \2 S" \
excel.cells[rowindex,colindex] = (convert.todatetime(row[col.columnname].tostring())).tostring(yyyy-mm-dd);2 O2 s' |2 @7 m  y0 w6 H3 @" P
xst.get_range(excel.cells[rowindex,colindex],excel.cells[rowindex,colindex]).horizontalalignment = xlvalign.xlvaligncenter;//设置日期型的字段格式为居中对齐! w" o* ?+ G7 T6 N! ^
}( E0 _* X. q  E9 D0 E
else; W( ^7 A3 n2 ~, V! C
if(col.datatype == system.type.gettype(system.string))& f8 A  N0 q* E: {8 z& v9 {, {
{
4 K& N; {( @) ^9 P+ P  zexcel.cells[rowindex,colindex] = '+row[col.columnname].tostring();$ u* k# q; P, `6 _% V. B2 J+ P
xst.get_range(excel.cells[rowindex,colindex],excel.cells[rowindex,colindex]).horizontalalignment = xlvalign.xlvaligncenter;//设置字符型的字段格式为居中对齐3 M* e# x& W0 _1 N% D% k" E- i
}
$ u! K# Q2 }" z% Nelse) d% Z3 @' {4 r9 r
{4 M/ O6 h- G& E9 @" F
excel.cells[rowindex,colindex] = row[col.columnname].tostring();
6 H9 ?6 Q( `" n3 N}
. e: Q) r; y0 q* A}
& W  q1 z. M8 C  G: M) S}
% a3 p. a2 g* W" M$ `//0 \' z2 S  ?* ]# v
//加载一个合计行
3 p" p9 R3 Z0 X, \* l//
8 E+ m4 [  I) c% G* b% d8 \int rowsum = rowindex + 1;
+ r+ q/ }: _0 m$ o: r5 nint colsum = 2;) [; E8 y7 \: n
excel.cells[rowsum,2] = 合计;; v7 R# g' Y6 G- `+ P
xst.get_range(excel.cells[rowsum,2],excel.cells[rowsum,2]).horizontalalignment = xlhalign.xlhaligncenter;
) L/ T2 i* h8 P- T( N+ m. b//
. d3 v: O* U  `//设置选中的部分的颜色
0 U8 j$ t' x) [* G; Q; w2 B, A//
3 A+ ]& T3 G& ]! }0 fxst.get_range(excel.cells[rowsum,colsum],excel.cells[rowsum,colindex]).select();* @2 b( S: n4 m. k
xst.get_range(excel.cells[rowsum,colsum],excel.cells[rowsum,colindex]).interior.colorindex = 19;//设置为浅黄色,共计有56种& w. b' w5 {$ r# L& E
//3 a0 C1 @+ n  y  v/ {* _# L
//取得整个报表的标题# q6 F$ e6 q( B0 b% l
//
0 Q! ~' o) a9 R! k- r$ mexcel.cells[2,2] = str;
( @: G+ W* _# I1 ]. f//2 F. d0 V! W+ _) P2 d" r
//设置整个报表的标题格式' ]+ R$ @% _; o* A- j) u
//- L3 J6 r2 M) F/ R! d
xst.get_range(excel.cells[2,2],excel.cells[2,2]).font.bold = true;4 n2 t8 G1 ?9 v- |, P
xst.get_range(excel.cells[2,2],excel.cells[2,2]).font.size = 22;
# ]* k4 l- `- m2 u1 d5 d//  l% \+ O+ D7 @' n
//设置报表表格为最适应宽度
$ g' E/ N( H0 ?3 N+ F" n( @& A//- h5 L9 |( c! G
xst.get_range(excel.cells[4,2],excel.cells[rowsum,colindex]).select();
9 d3 L/ K+ G. @2 C2 ixst.get_range(excel.cells[4,2],excel.cells[rowsum,colindex]).columns.autofit();. l/ D% m- t: o
//: q# ?! K0 b& J; V, h- Q" K
//设置整个报表的标题为跨列居中
1 G, i1 s8 e( n- U7 l5 l3 u//
. ]4 Y9 `4 ?1 ]0 N7 _xst.get_range(excel.cells[2,2],excel.cells[2,colindex]).select();/ d& U; n7 N9 q) J. f! v! f( A9 j
xst.get_range(excel.cells[2,2],excel.cells[2,colindex]).horizontalalignment = xlhalign.xlhaligncenteracrossselection;
; Y) x: m& t; P/// B7 \5 x9 M) C% i% y
//绘制边框! z/ m! v* v: z( q
//4 t0 S$ P3 `: F8 B6 ^
xst.get_range(excel.cells[4,2],excel.cells[rowsum,colindex]).borders.linestyle = 1;
/ [6 Y+ x2 M' }7 xxst.get_range(excel.cells[4,2],excel.cells[rowsum,2]).borders[xlbordersindex.xledgeleft].weight = xlborderweight.xlthick;//设置左边线加粗6 c, L0 O! S+ l. {6 m
xst.get_range(excel.cells[4,2],excel.cells[4,colindex]).borders[xlbordersindex.xledgetop].weight = xlborderweight.xlthick;//设置上边线加粗
! X1 ]6 S" I4 P; R' `xst.get_range(excel.cells[4,colindex],excel.cells[rowsum,colindex]).borders[xlbordersindex.xledgeright].weight = xlborderweight.xlthick;//设置右边线加粗
9 C. D1 ^/ s- Y% ^5 {; J1 Q1 Jxst.get_range(excel.cells[rowsum,2],excel.cells[rowsum,colindex]).borders[xlbordersindex.xledgebottom].weight = xlborderweight.xlthick;//设置下边线加粗0 k2 i6 Q6 Y4 I! n* V3 E
//
0 X9 A: P- \* `9 ?9 W4 S6 g) e//显示效果5 J, |6 T* \/ R2 c! _( L
//+ l9 P5 ]/ D) G& O! j
excel.visible=true;
5 h; d9 k3 w/ `2 \2 n% z/ _//xst.export(server.mappath(.)++this.xlfile.text+.xls,
5 n) x' G* Y/ y+ H! S4 P8 ]sheetexportactionenum.ssexportactionnone,microsoft.office.interop.owc.sheetexportformat.ssexporthtml);& y! I6 @9 t# B: {3 C3 I
xbk.savecopyas(server.mappath(.)++this.xlfile.text+.xls);3 L/ |  [& P  {$ q
ds = null;2 U/ h1 s3 u6 P) f
xbk.close(false, null,null);
3 {" D0 [' I; c! sexcel.quit();
6 f9 C/ ?9 t- C# Vsystem.runtime.interopservices.marshal.releasecomobject(xbk);
' R" u/ t7 R: a* O" N/ p$ Lsystem.runtime.interopservices.marshal.releasecomobject(excel);
- z+ W1 ?# A/ w9 Gsystem.runtime.interopservices.marshal.releasecomobject(xst);' e( N- e& M1 c1 C" j# Y+ h/ ~
xbk = null;
$ O3 q0 @! r8 _excel = null;2 T/ J/ B! t1 d
xst = null;
4 _; K0 R, T% b* u( C: a+ X" x$ ogc.collect();
1 V' D0 V) d2 C: ?# {string path = server.mappath(this.xlfile.text+.xls);
5 ~) T- j0 c: {7 N3 Gsystem.io.fileinfo file = new system.io.fileinfo(path);
8 j- i  N: ?7 z9 F6 ~response.clear();+ U) H; i8 Q  }% i( O3 F
response.charset=gb2312;2 U  \5 g2 x- b' W/ L! G
response.contentencoding=system.text.encoding.utf8;
% @4 M' O- I9 q0 N( s) ]! S, E// 添加头信息,为文件下载/另存为对话框指定默认文件名- X) c$ h3 [  a* f  O- L
response.addheader(content-disposition, attachment; filename= + server.urlencode(file.name));
' }% p; z# k3 F9 ?* W* G// 添加头信息,指定文件大小,让浏览器能够显示下载进度
- w, u6 m! C1 l' ?response.addheader(content-length, file.length.tostring());
; _( x. u) l. q// 指定返回的是一个不能被客户端读取的流,必须被下载" E  i+ L* @* B8 z
response.contenttype = application/ms-excel;
; g; [; _- s# q: d5 n6 u// 把文件流发送到客户端
$ ?" K/ p9 \1 g9 R& yresponse.writefile(file.fullname);  q! D3 I9 e: ?( M: ]7 L, t
// 停止页面的执行
: L' f. i! H5 s: }, Z0 ^' X7 |, Bresponse.end();
, [. [8 s" |7 p; f}! i( i. `6 [5 X" l5 c  g5 C7 ]
导入、导出excel中的一些问题汇总
- h; P3 K1 C' T4 l/ D+ i  q, T一、在项目中的添加引用:
: m; [$ K  q1 g2 c  f5 Y5 j, v$ b/ J右击项目资源管理器的引用-->添加引用-->选择.net选项卡-->选择microsoft.office.interop.excel-->确定(如下图);
; x  `2 Y# j7 H+ a5 O) }9 T! ?在选择时注意一下.net组件的版本号,图是的12.0.0.0是office2007的版本:8 T5 W$ ^( u, C' m* m
二、在项目中使用microsoft.office.interop.excel:
+ C9 U: M0 K' e如果想使用microsoft.office.interop.excel,首先需要在项目中引用命名空间:
9 N4 d% n% P( O$ husing microsoft.office.interop.excel;
1 m" r! }5 e2 F. N4 o三、建立excel.application相关对象
+ L5 s: h( `4 p7 K0 ~//建立application对象
  R6 F: K; ?/ F) O( v0 umicrosoft.office.interop.excel.application myexcel = new application();
* ~2 J! O, Y8 l8 ]. h1 e3 M" k& E& u//建立workbooks对象+ ?$ o# X6 n; n. z' q7 L
workbooks mybooks = myexcel.application.workbooks;7 l4 n- s4 r" _. D0 k7 p. e
//建立一个system.reflection.missing的object对象
' v1 O! v+ p" G+ F4 Kobject omissing = system.reflection.missing.value;* s* N8 J" e" R6 [
四、打开或新建excel的book文件9 u9 n8 n7 x  g, N" R
//打开excel文件,注意里的“exccelfilepath”为excel文件在服务器上的物理地址,包括文件名8 L0 F% Q. n' m/ i
workbook mybook = mybooks.open(exccelfilepath,omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing);0 j8 k0 U9 f* s
//新建workseet对象,,此处为要操作的工作表 ,当前要操作的工作表的获取方法有两种:使用工作表的索引值或使用工作表的名称,名称默认为:“sheet1”/“sheet2”等2 h# c4 q8 d: g  m# R
worksheet mysheet = (worksheet)mybook.worksheets[1];* V$ ~2 }) U6 R; i3 J
//如果是新建excel工作簿,需要 设置如下两行内容,以保证工作簿中有一个工作表,) u- z$ r: |0 \+ b' `4 ^: O/ H
workbook workbook1 = excel1.workbooks.add(true);
, ^, Y7 s8 z! C0 [6 e9 r, B: W* ~worksheet mysheet= (worksheet)workbook1.worksheets[sheet1];
5 T# s5 O, {& H( b//设置excel对象是否显示界面,默认为false不显示界面
9 W9 t' S# d- F+ K# C8 ]; f9 [myexcel.visble=true;
3 }. E5 T+ N0 o" B2 F* L五、一些比较重要的针对excel的操作* s. q. p. P% O+ ?9 V* e
1、获取range对象2 q+ i* _9 U5 G0 b0 E
①、获取一个单元格的range对象:
9 ^- `  b9 {% g7 ?5 W5 o: F$ z//选择第一行、第一列的单元的单元格为range对象
5 q& j; q4 L2 r7 y1 _4 D8 ~; {range r = (excel.range)mysheet.cells[1, 1];4 \) X: U& P" T: N. j
//选择多个连续的单元格为range对象+ F6 w7 _" A7 A1 O
range r=(excel.range)range.get_range(a1:f3)
6 I' I( b: [& h( z0 l4 Y②、给单元格赋值或取出单元格的值:7 l# I: {! |: F- a% T, i' t( W9 m
//已选择了range对象的赋值:
: N* P+ y( z( _, u& Ur.text=中国;4 f* M0 k) W& u- d
//未选择range对象的赋值:+ ~* g: g% Y7 |2 D
mysheet.cells[1,2].text=中国;
, B) f; a/ g9 v//已选择了range对象的取值:8 m9 y0 O! G! K: V+ W3 s
string strvalue= r.text;
5 v" e0 g0 X2 X$ R" }7 b0 V//未选择range对象的取值:- n0 u, \7 u6 q: ~2 x. ~
string strvalue= mysheet.cells[1,2].text;6 Q1 p5 q3 a& i6 Q/ d8 Y
③、给单元格设置边框! L& W! A6 [3 R8 v8 N
mysheet.cells[2, 1].borderaround(xllinestyle.xlcontinuous, xlborderweight.xlthin, xlcolorindex.xlcolorindexautomatic, null);//画线
1 }' q' j( e9 G④、合并单元格
7 O7 E3 [) w9 s, p$ ]6 v9 W6 e* X//合并单元格前先要将要合并的单元格选择为range对象1 X$ {: J, B; k9 b* ?6 d4 F
range r=range.get_range(a1:f3);
6 x- @% H8 K* ~" t: k2 C5 e8 t# I, n" Y- Q//然后现设置合并单元格
/ k8 M, N/ Y+ `1 a5 Rr.mergecells = true;; n- _, L1 k: i' x2 @: x1 l! P
⑤、设置单元格的字体、字号、背景色等属性
, o, j7 F: Y! }2 S4 H* b# umysheet.cells[1, 1].font.name = 黑体;
" ~! \% n! |* g/ P* Dmysheet.cells[1, 1].font.size = 20;# Y4 f/ Y  F5 d
mysheet.rows[1:1].rowheight = 40;
. l) x7 B, ?5 a' ^$ [mysheet.cells[1, 1].interior.color = color.fromargb(224, 224, 224);//设置颜色6 q  r% Y0 n8 f2 u6 Z9 z
⑥、删除一行:
, F# j9 y6 x; n- j//首先获取要删除的行的range
6 k# {7 W/ A9 [microsoft.office.interop.excel.range range = (microsoft.office.interop.excel.range)mysheet.rows[sendedrow[1], type.missing];
0 q7 ?+ S3 z/ e8 e//注意删除行后删除后的行号被下面的行替换,如果逐行删除,请先从最大的行号往最小的行号删除
0 ^# S7 Q6 V# ^# C" `! arange.delete(microsoft.office.interop.excel.xldeleteshiftdirection.xlshiftup);5 A7 f" T$ l$ ?
⑦、获取有数据的行数
8 f! f! W- ~1 h/ m) u+ Xint rowsint = mysheet.usedrange.cells.rows.count;
% K' @7 b  S% F, b$ v& _; d: h六、excel文件的保存与退出! z1 `) Q# f' R$ N4 \
1、excel的保存与退出/ L4 L% d7 h( T! U6 M
mybook.save();. X6 ?, f  b( K- u9 R: M, @
mybooks.close();
, g3 Y, o# w4 A; pmyexcel.quit();6 K2 X8 k- c+ T  n" g8 W
2、excel指定文件保存" @8 W. o/ r+ _( S2 G3 O
mybook.close(true, filepath +_file_name, null);
5 y0 s" H; h% r+ `% M3 H% C4 l# e七、释放excle对象的资源与结束excel 进程0 ]$ S0 L: [1 Y6 B8 A
关于这方面内容有好多网友都在讲多种方法,经过本人实践,以下方面才能真正做到结束excel的任务进程:% Q8 C% I; Q  \
1、将所有以上对excel的操作放到一个方法中,) X/ h7 @1 O+ I! P
2、在操作excel后,即时将不使用对象一一释放并赋null值:- x. T" r# w6 D
system.runtime.interopservices.marshal.releasecomobject(mysheet);
4 z0 I. k" M8 o2 wmysheet=null;
5 C( V' @' G% ~- [system.runtime.interopservices.marshal.releasecomobject(mybook);
/ ~1 C& L& f$ X7 nmybook=null;//http://www.111cn.net
  y+ `2 s: ?9 \/ Y. s& O0 t: Bsystem.runtime.interopservices.marshal.releasecomobject(mybooks);9 s( f9 P% o2 i( P* j* s  a) {/ F' k" l
mybooks=null;
2 ^" \, ~% D4 t% y  f1 x3 C, ^system.runtime.interopservices.marshal.releasecomobject(myexcel);
3 l" C3 D9 k6 M. n  Z" F) K' ~  Lmyexcel=null;% i9 G5 W# J% Z) b/ j% Y
3、再新建一个方法,并以该方法中执行上面新建的操作excel方法,并在执行完操作excel方法的后面添加gc.collect():# W! _" U4 O; J. _
//下面方法中outputexcel()方法是输出excel文件的对excel 操作的方法, D$ S6 Q! ~6 F, `# [
private void killexcel()
7 j( k% a: @; }6 S; V% S) p/ X5 e{  U) C  ?  f6 J, u" T6 q- P8 ]
outputexcel();4 ]: q4 y+ ~/ D
gc.collect();8 O# D4 \  ~, {$ m
gc.waitforpendingfinalizers();
5 {" e# k, P7 A* H}
. [" O# G. q+ o- G好多网友都在介绍使用gc.collect()释放excel占用的资源来结束excel进行,如果将“gc.collect();”与操作excel的业务写在一个程序块中,“gc”是永远不能结束excel进程的,在web应用程序中,这种现象是很可怕的事情。原因是gc不会清理本程序块中的垃圾内存的。
& K' z9 j5 _% N- |6 m" n4、在业务事件中调用killexcel()方法:
: O7 C! g  z! q: ]) `protected void linkbutton3_click(object sender, eventargs e)
/ h4 O' v; d7 o) R6 X3 \! t) V{+ O9 ?% I" D  ]" s# g9 Q
//导出excel
! r0 A4 @  p; ]  Wkillexcel();  a" l' ~% q/ r' b+ F( h9 o4 r
}
9 ~4 Y+ b% [. y! V# L- i9 n八、一些权限的基本设置:' y2 E- D  r5 I
使用以上方法在开发环境中调试程序没有一点问题,等发布到服务器上后,程序还是不能正常运行,需要进行如下的权限设置:* W2 X; X4 k" a2 X9 ^
1、.net导出excel遇到的80070005错误的解决方法:3 \! K) d" V# ], `& w8 D/ k
检索 com 类工厂中 clsid 为 {00024500-0000-0000-c000-000000000046}的组件时失败,原因是出现以下错误: 80070005基本上.net导出excel文件,都需要如此配置一下,不配置有的时候没错,而配置后基本应该不会出错。. }0 C$ I9 ^: |2 J/ T' j' }
具体配置方法如下:- i$ G, p0 E( q6 \" r
1:在服务器上安装office的excel软件.' G7 g7 r# H( o" v) Y
2:在开始->运行中输入dcomcnfg.exe启动组件服务
" u% r& f+ o2 b3:依次双击组件服务->计算机->我的电脑->dcom配置! B" z# G- {+ R! n
4:在dcom配置中找到microsoft excel 应用程序,在它上面点击右键,然后点击属性,弹出microsoft excel 应用程序属性对话框3 R9 H) ^& ~5 Q/ _8 u$ O+ v
5:点击标识标签,选择交互式用户
# z$ |( T3 H. n6:点击安全标签,在启动和激活权限上点击自定义,然后点击对应的编辑按钮,在弹出的安全性对话框中填加一个network service用户(注意要选择本计算机名),并给它赋予本地启动和本地激活权限.
# k+ n, h5 `, e7:依然是安全标签,在访问权限上点击自定义,然后点击编辑,在弹出的安全性对话框中也填加一个network service用户,然后赋予本地访问权限.
* d6 A3 P6 Y+ B: W, n% E# ]8.如果交互式用户设置后出现错误8000401a,可取消交互式用户,指定为administratr,可暂时解决此问题。进一步的解决方式还有待探讨。
/ b+ X, S9 i! U9.采用第8点的设置后,打开excel可能会出现“无法使用对象引用或链接”,并且不能进行单元格粘贴。原因不明,取消设置后即可消失。
9 O) t7 t5 y: q5 w; G! U8 e) A以上是本人在近期作开发时的一点心得,现整理成文档,供奋战在程序开发一线的朋友共享,愿看到的网友能名帮助解决“无法使用对象引用或链接”的问题。
3 v: V, Z, u1 s" y) r
& T! E6 ^" y' S/ s+ \更多网页制作信息请查看: 网页制作

回复|共 10 个

GoodyFouppy 发表于 2016-1-21 21:04:33|美国 | 查看全部
终于看完了~~~
buingeEvineus 发表于 2016-1-21 21:04:30|美国 | 查看全部
@,@..是什么意思呀?
Acropozelan 发表于 2016-1-21 21:03:18|美国 | 查看全部
哈哈 小心被她看见哦~~~~
mwxny 发表于 2016-1-21 21:03:48|美国 | 查看全部
笨点也好~~~~
wwzcdenleclv 发表于 2016-1-21 21:04:25|澳大利亚 | 查看全部
怎么就没人拜我为偶像那??
alapScady 发表于 2016-3-5 10:19:05|美国 | 查看全部
不为楼主的标题所吸引,也不是被贴子的内容所迷惑。
effoggikeftor 发表于 2016-3-5 10:20:03|美国 | 查看全部
呵呵 那是啊~~
effoggikeftor 发表于 2016-3-5 10:18:49|德国 | 查看全部
还呕像.....
alapScady 发表于 2016-3-5 10:20:25|INNA | 查看全部
老大,我好崇拜你哟
Mqokjdvq 发表于 2016-3-5 10:19:07|日本 | 查看全部
这个得知互动技术交流论坛很不错

回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

得知互动是一个融创意、设计、开发、营销、生活、互联网于一体的专业交流分享平台。
Copyright © 2026 站长技术交流论坛|互联网技术交流平台 版权所有 All Rights Reserved. Powered by Discuz! X5.0 鄂ICP备15006301号-5|鄂公网安备 42018502006730号
关灯 在本版发帖 扫一扫添加QQ客服 返回顶部
快速回复 返回顶部 返回列表