返回列表 发新帖

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

364.5k 10
swmozowtfl 发表于 2015-7-18 00:12:19|湖北 | 查看全部 阅读模式
1、由dataset生成; \' D/ f8 M, v: Q& L
代码如下:8 T/ s7 R1 V4 n; q
public void createexcel(dataset ds,string typeid,string filename): G; m' }1 k: q' v0 _; e4 p; F, M
{
5 P2 ?# s: J& e8 g5 X: Mhttpresponse resp;; L9 O" z7 ]7 X$ b) ?; C) m
resp = page.response;
, Y+ o; ~' h- l6 P& e* T  Mresp.contentencoding = system.text.encoding.getencoding(gb2312);$ {0 l& g! T6 {
resp.appendheader(content-disposition, attachment;filename= + filename);, j/ M- e/ j  w- N" T
string colheaders= , ls_item=;
4 A3 s- f1 ?' n- T9 N4 o; p0 f# tint i=0;, Q! s+ g! D6 I
//定义表对象与行对像,同时用dataset对其值进行初始化5 q% \- Z- g: r0 E( Z/ ]0 `, V
datatable dt=ds.tables[0];) E% z6 p2 ?3 E* G: s) w
datarow[] myrow=dt.select();% ~  ?( d% ]' w" k: ~) u6 j3 G/ o
// typeid==1时导出为excel格式文件;typeid==2时导出为xml格式文件
5 b0 B6 ?  M7 tif(typeid==1)9 O- \( u" j7 Q7 V$ Q  w* m# _9 H$ E: e$ R
{
) E- [, L& O7 e5 @4 P% Q$ o//取得数据表各列标题,各标题之间以t分割,最后一个列标题后加回车符# p3 }: S& p$ C( s, z: }  S
for(i=0;i colheaders+=dt.columns.caption.tostring()+t;! F# `4 D  w1 h; W% s1 d
colheaders +=dt.columns.caption.tostring() +n;6 y3 F3 k& N$ V. K( y
//向http输出流中写入取得的数据信息
% ?4 ]1 }5 _/ t7 r% y9 \% Xresp.write(colheaders);2 |+ j2 m/ I5 A# W
//逐行处理数据
* s' A( ?# [5 yforeach(datarow row in myrow)
1 P5 h: }! o! N1 a6 C1 L{! Q0 B! B: n' P( `  h0 N* J
//在当前行中,逐列获得数据,数据之间以t分割,结束时加回车符n2 u6 N7 z* Z- B
for(i=0;i ls_item +=row.tostring() + t;! L7 _& J  k' R4 _) K
ls_item += row.tostring() +n;
9 Y1 r/ F/ K# f$ x//当前行数据写入http输出流,并且置空ls_item以便下行数据
# Q, c- o" `7 r& J) \- I0 a' {* @9 Kresp.write(ls_item);1 _* O' o. t$ l7 e* w" j
ls_item=;# m* _  t5 P. {: A- J8 f; R" o
}- {# T3 e, E( w
}
6 S4 }4 M  P5 G, M$ b0 c- i6 e% c4 `else
( Q9 [+ c8 o1 B3 \{
+ t1 Q# Z" w* h$ k0 y3 M& `' f& bif(typeid==2)
* o2 @. ]7 t0 k. o, k7 S7 o/ q{
6 C! S8 w. Q* e# x//从dataset中直接导出xml数据并且写到http输出流中
1 {# Y+ M8 d: F0 L% J) @& W& b9 Gresp.write(ds.getxml());
: P: {/ Y) b5 m# c8 V4 V}
( n  B% x) J8 c5 v- F& g4 b/ c8 N3 z- o- [}% Q, I0 ~, n* r$ ~- {
//写缓冲区中的数据到http头文件中
; A: x) V, j1 a( b% K1 X0 sresp.end();- H1 ~7 Q; t' K& I% e7 U% ~3 d
}
7 L% @& j; m, m2 C2 D& c, ?2、由datagrid生成
4 {1 a' ~) F/ T2 Q代码如下:9 U7 L- A4 }3 k: h
public void toexcel(system.web.ui.control ctl)
& t! `5 u" g( y7 V1 x% l{$ H9 C; F; N) w/ q9 O3 v2 ^: J
httpcontext.current.response.appendheader(content-disposition,attachment;filename=excel.xls);
$ ]# o* Q+ {7 }httpcontext.current.response.charset =utf-8;
" k+ Q+ \2 w( m# B# T) x, vhttpcontext.current.response.contentencoding =system.text.encoding.default;  [, p! ~$ `. t* h5 p
httpcontext.current.response.contenttype =application/ms-excel;//image/jpeg;text/html;image/gif;vnd.ms-excel/msword3 B# h/ t$ O6 F0 U) G/ E1 i
ctl.page.enableviewstate =false;
2 p* t! M9 i  Psystem.io.stringwriter tw = new system.io.stringwriter() ;1 b; Z' V6 n4 Z% M4 E: J3 T
system.web.ui.htmltextwriter hw = new system.web.ui.htmltextwriter (tw);
" N1 @# L: Q- qctl.rendercontrol(hw);
7 p. U/ [2 @$ R8 W  M8 Rhttpcontext.current.response.write(tw.tostring());
8 M6 y1 ~1 u1 `httpcontext.current.response.end();
$ N" t% S8 C1 ^; z* ]}
2 T: T# Z9 i. |; L( V用法:toexcel(datagrid1);
$ x$ {3 j* Y; V' K$ W! L1 ]/ n5 A3、这个用dataview# Q7 d. L3 i) L4 `' x' M
代码如下:
6 S3 M- N# r' q; z; o
public void outputexcel(dataview dv,string str)" r7 C- {  [& M2 a- u2 m
{
6 r, }# t" b6 p% k9 H//
- H# c2 J, ~9 _! G# i  b; e// todo: 在此处添加构造函数逻辑
& o* Y9 V8 k; g//
1 r3 d" l6 X9 e) d- K3 A% S//dv为要输出到excel的数据,str为标题名称
: Z: N' R; n# M0 G( S/ }1 K7 M' Qgc.collect();
# k9 V+ Z) r* Z. }application excel;// = new application();
7 ^2 D" x6 `. R( N) |6 n# \int rowindex=4;4 @, x1 |2 m# I
int colindex=1;
& z* B2 F+ W8 @_workbook xbk;
. d/ \1 T( y/ w& g& b_worksheet xst;' a3 V: L! }0 T2 w
excel= new applicationclass();
* O6 n4 g- S/ i7 a6 Exbk = excel.workbooks.add(true);- x. g* K( {# n- H
xst = (_worksheet)xbk.activesheet;
  E& C% l/ Q, ]# M3 \5 b//
7 Z4 \+ o0 L* V) z& k//取得标题+ M. o+ Y* x$ o8 `- M
//
: F3 N) K. m" E# iforeach(datacolumn col in dv.table.columns)0 Q" l1 N+ {5 R+ _- @+ b
{8 G+ H3 D5 W$ P( b0 H% s
colindex++;
! B9 w8 z9 x% n4 gexcel.cells[4,colindex] = col.columnname;
5 V' G6 R8 b9 `+ p& d$ V1 Nxst.get_range(excel.cells[4,colindex],excel.cells[4,colindex]).horizontalalignment = xlvalign.xlvaligncenter;//设置标题格式为居中对齐  S4 Z; {) T% `* w2 d. f8 i2 ]
}7 `$ n* \: y/ I- o2 J
//
  w* L! [# P6 N1 X3 D( D4 p//取得表格中的数据2 q  C  P- ^0 _, ]1 k0 O, m6 z
//
0 A. C3 P4 R! zforeach(datarowview row in dv)
% l4 ?. j1 r" T  g{; ~$ _4 A( E& S( ?* y8 |
rowindex ++;
4 V1 L9 }$ O) c9 {: |; j& Hcolindex = 1;- \5 T0 ]: n- V0 G7 X
foreach(datacolumn col in dv.table.columns)% H& i# n/ I3 F! ~- o! o' T. ^
{
: q* k2 u: x8 ?+ Z, l. U/ `: pcolindex ++;( q1 Q  }7 e4 I  G* d9 q! W" ^
if(col.datatype == system.type.gettype(system.datetime))' K' m6 u7 I6 X+ D, M* m
{
5 P# p; N( W$ U( |9 Gexcel.cells[rowindex,colindex] = (convert.todatetime(row[col.columnname].tostring())).tostring(yyyy-mm-dd);( R0 E( v8 F" p
xst.get_range(excel.cells[rowindex,colindex],excel.cells[rowindex,colindex]).horizontalalignment = xlvalign.xlvaligncenter;//设置日期型的字段格式为居中对齐
5 B. ^2 j/ b0 D1 D1 m, f# F}  _6 p! v0 B2 u) O7 S
else
/ q. K1 v2 L& ?5 sif(col.datatype == system.type.gettype(system.string)). O  V! F) N- {$ k8 z5 y) s
{
5 ^6 q" B( b& P: b- [% Q2 nexcel.cells[rowindex,colindex] = '+row[col.columnname].tostring();
/ [( k- M  B# B* a" xxst.get_range(excel.cells[rowindex,colindex],excel.cells[rowindex,colindex]).horizontalalignment = xlvalign.xlvaligncenter;//设置字符型的字段格式为居中对齐
# c' d# H$ h& o) j2 D$ P9 i. C}
" B" }* i. D/ t# Pelse6 v+ Q4 g7 K2 B6 `) v) \8 j  v) _* s
{
) T9 Q, ^/ c3 W: z0 Rexcel.cells[rowindex,colindex] = row[col.columnname].tostring();9 l5 c- j' g% [" s
}
' J& v1 k- d! g( w# v3 _3 {# `}/ o. T# H% n% T( s6 o1 h) R
}  C# Q$ h& {7 [7 P9 F- n! b0 k
//. a  p- p3 Y0 P4 k1 L5 [! z) H1 q
//加载一个合计行
  ?; U* h; r& `//, K% d' U6 u$ t& h# q) O
int rowsum = rowindex + 1;- F& r6 d5 [$ q* m. |1 v! f5 q
int colsum = 2;
- O  ]' d& ]8 s" d7 {# `% N# Sexcel.cells[rowsum,2] = 合计;
/ ~. Y# i; R! q" C& ?1 Mxst.get_range(excel.cells[rowsum,2],excel.cells[rowsum,2]).horizontalalignment = xlhalign.xlhaligncenter;( G) j) K: d1 }. Z# k( g' t2 ]
//
% T: t$ w! \! }% p0 ~  Y2 @' U//设置选中的部分的颜色: [: r4 c3 ~: j$ O
//' B9 i# r+ Z1 t# S; ]) B+ y  P
xst.get_range(excel.cells[rowsum,colsum],excel.cells[rowsum,colindex]).select();; U, f4 T( x* N! \# i6 Y+ d
xst.get_range(excel.cells[rowsum,colsum],excel.cells[rowsum,colindex]).interior.colorindex = 19;//设置为浅黄色,共计有56种
6 g' ^) ?  w" i/ G, p# V//; G9 I, n1 @1 X
//取得整个报表的标题
" B( y9 k$ l* G  Z' j$ Q//
4 ?& _" |: o, _' V/ c$ x: nexcel.cells[2,2] = str;
; _* H5 y2 e3 Z, B1 G//
  f* J1 U5 H* J- X+ `, X( ]//设置整个报表的标题格式9 m& e0 b1 M, f9 v
//- D* Z7 T& o, w& F
xst.get_range(excel.cells[2,2],excel.cells[2,2]).font.bold = true;6 P( p' H( W5 I' d' c2 s/ Q
xst.get_range(excel.cells[2,2],excel.cells[2,2]).font.size = 22;( z% p9 l3 a: S! ~3 b$ r3 [9 R
//
) _9 |0 r' v3 F# R  ~) f//设置报表表格为最适应宽度! `( Y& n' ]+ x
//2 a# m% c2 ]7 e! r
xst.get_range(excel.cells[4,2],excel.cells[rowsum,colindex]).select();
& N/ R- B5 ]* T1 X  L3 sxst.get_range(excel.cells[4,2],excel.cells[rowsum,colindex]).columns.autofit();: B- z$ Z0 m1 }$ Z/ K
//
! h) J& f) h  C2 I//设置整个报表的标题为跨列居中) v( w9 M! L0 {" N* s
//! N2 s- a. v: D! B# I! B2 D
xst.get_range(excel.cells[2,2],excel.cells[2,colindex]).select();
4 [0 ]0 s' ~: O' M& I; I" {0 jxst.get_range(excel.cells[2,2],excel.cells[2,colindex]).horizontalalignment = xlhalign.xlhaligncenteracrossselection;. C; a: [2 Z4 X( m2 j! l
//
5 F0 L1 l0 F. M$ b3 Q0 i. J/ Q//绘制边框/ n4 X: x' S0 |6 d0 a" n! G6 I& D
//
9 b$ t  p6 k0 Y3 vxst.get_range(excel.cells[4,2],excel.cells[rowsum,colindex]).borders.linestyle = 1;% {: ^: I1 Y! X/ j( l. ?
xst.get_range(excel.cells[4,2],excel.cells[rowsum,2]).borders[xlbordersindex.xledgeleft].weight = xlborderweight.xlthick;//设置左边线加粗
; x1 e/ v6 z5 y- [7 j! }xst.get_range(excel.cells[4,2],excel.cells[4,colindex]).borders[xlbordersindex.xledgetop].weight = xlborderweight.xlthick;//设置上边线加粗4 ]+ ~0 M+ S/ o. U" Y. V
xst.get_range(excel.cells[4,colindex],excel.cells[rowsum,colindex]).borders[xlbordersindex.xledgeright].weight = xlborderweight.xlthick;//设置右边线加粗
7 u2 F+ W* u+ [# I+ v' nxst.get_range(excel.cells[rowsum,2],excel.cells[rowsum,colindex]).borders[xlbordersindex.xledgebottom].weight = xlborderweight.xlthick;//设置下边线加粗
# Q) S  Z' v3 a& x; E% n1 |" N& B5 m5 q//
! X8 T! g$ z& Z//显示效果
- x9 M% k) j3 R% A//) d7 i$ {- c% d! s  c( H
excel.visible=true;
4 {: h4 G* g7 S! c/ u! |) I//xst.export(server.mappath(.)++this.xlfile.text+.xls,7 E/ @! K: o8 ~* i, q8 E: q/ @  [
sheetexportactionenum.ssexportactionnone,microsoft.office.interop.owc.sheetexportformat.ssexporthtml);
/ h: p# J* |% V6 l! txbk.savecopyas(server.mappath(.)++this.xlfile.text+.xls);
4 c2 y4 f' k! }0 V) S6 f" Ods = null;
( N2 q) M, {& _' kxbk.close(false, null,null);
* |1 Y6 b9 M  H& Q6 j$ Iexcel.quit();
# F# O! N0 s2 k% F+ d8 E# ssystem.runtime.interopservices.marshal.releasecomobject(xbk);
. c, f$ S* D$ W0 Usystem.runtime.interopservices.marshal.releasecomobject(excel);
# i( l" r5 D& ]! O7 Ksystem.runtime.interopservices.marshal.releasecomobject(xst);
6 t- U6 ~2 r9 u( Exbk = null;$ C  H$ T" ^4 Z' \2 w9 z
excel = null;
3 `& u3 a0 `' f, M2 ^' Sxst = null;( O8 b3 @8 M3 e  j  e
gc.collect();
- \5 S- m/ v# [, A$ k! Z+ Kstring path = server.mappath(this.xlfile.text+.xls);  c) g- W8 _; y! h' m$ R
system.io.fileinfo file = new system.io.fileinfo(path);9 Q# P9 J- b# j  i: h2 V
response.clear();) G* y4 }5 p' a; j: \8 r
response.charset=gb2312;  i6 ]! q, h3 o& G+ Z
response.contentencoding=system.text.encoding.utf8;0 [5 m) z! K; h: j* t
// 添加头信息,为文件下载/另存为对话框指定默认文件名
- V# L, u7 C1 ~" xresponse.addheader(content-disposition, attachment; filename= + server.urlencode(file.name));
2 |  B- K/ P9 K// 添加头信息,指定文件大小,让浏览器能够显示下载进度% w5 W1 U, y. R/ R, W/ n* w9 B. U3 x6 P
response.addheader(content-length, file.length.tostring());, Z2 d* X! q; |* R# `2 s# G
// 指定返回的是一个不能被客户端读取的流,必须被下载' g2 @8 }' \0 s7 |- b4 z% M
response.contenttype = application/ms-excel;& e2 T+ N: I( t( O, T+ ]6 k$ f2 l
// 把文件流发送到客户端
4 ~, V+ Q4 ]3 Q' b. y( t: Kresponse.writefile(file.fullname);' `" Y$ Q  ?. S5 n5 {& x
// 停止页面的执行! |- x  T# f0 A
response.end();
" ?: F; M. \6 X( J}
# B6 A& H. u* t* M1 w  m2 _导入、导出excel中的一些问题汇总
' e4 O; s9 l7 t. a8 Q一、在项目中的添加引用:# R% a$ \6 x! o8 Y
右击项目资源管理器的引用-->添加引用-->选择.net选项卡-->选择microsoft.office.interop.excel-->确定(如下图);8 _, G* U$ q2 f! _* Y0 Y2 X5 n8 A
在选择时注意一下.net组件的版本号,图是的12.0.0.0是office2007的版本:
3 Q. U7 Y* T3 z2 s二、在项目中使用microsoft.office.interop.excel:
1 Y+ J/ N5 t0 K1 ?如果想使用microsoft.office.interop.excel,首先需要在项目中引用命名空间:
9 e( g0 P# R4 Yusing microsoft.office.interop.excel;& T* C& F/ \/ s
三、建立excel.application相关对象
. U9 G! `0 b4 n1 c//建立application对象1 Z+ B, m: i; d- `4 F
microsoft.office.interop.excel.application myexcel = new application();
9 ]( D/ \: w. |$ R; R//建立workbooks对象
& M5 |" K& R. p# \. e) bworkbooks mybooks = myexcel.application.workbooks;) D# a0 u; K7 c- _) B6 l/ q9 a. C
//建立一个system.reflection.missing的object对象
( L5 O( K, b. `) i* o5 W9 |object omissing = system.reflection.missing.value;1 Z1 o+ e6 z$ c6 Z9 }8 ]6 K" D
四、打开或新建excel的book文件
) h3 D3 D: F# t) t7 Q5 X//打开excel文件,注意里的“exccelfilepath”为excel文件在服务器上的物理地址,包括文件名0 H" t$ D  ]% z- b2 ?- w' b
workbook mybook = mybooks.open(exccelfilepath,omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing);' Y% i8 Q+ ~7 `5 P, a7 u9 t
//新建workseet对象,,此处为要操作的工作表 ,当前要操作的工作表的获取方法有两种:使用工作表的索引值或使用工作表的名称,名称默认为:“sheet1”/“sheet2”等2 M  J! D+ h) ]% t' v$ n6 Y! s( _
worksheet mysheet = (worksheet)mybook.worksheets[1];
9 t) Q* `9 n3 g# R; B//如果是新建excel工作簿,需要 设置如下两行内容,以保证工作簿中有一个工作表,
: q  u. B9 J! D6 t, ]workbook workbook1 = excel1.workbooks.add(true);& {  B( s4 k8 M
worksheet mysheet= (worksheet)workbook1.worksheets[sheet1];+ N; I0 ]0 a! h8 ~0 Y
//设置excel对象是否显示界面,默认为false不显示界面
& v2 J- H6 t, }* o5 dmyexcel.visble=true;+ b3 U& }2 N7 T- P. A2 b. j
五、一些比较重要的针对excel的操作
$ |3 i) R1 y* t1、获取range对象
% J; f7 W! k( L. n①、获取一个单元格的range对象:
# h( i7 H: G* K& |  I5 C) s//选择第一行、第一列的单元的单元格为range对象
, r, w7 K; V3 M! erange r = (excel.range)mysheet.cells[1, 1];) K! b" Q# \% g
//选择多个连续的单元格为range对象! e9 G! q" I6 P- Z+ {
range r=(excel.range)range.get_range(a1:f3)2 m5 T. p" ~; R; O! N1 I: h3 Y
②、给单元格赋值或取出单元格的值:# X: _: g; F! J  Z+ p
//已选择了range对象的赋值:
( Z) t5 C4 d5 I0 O" m3 X" Or.text=中国;
4 }/ @5 g  A( t( H//未选择range对象的赋值:
  U0 n% P& G9 g" Gmysheet.cells[1,2].text=中国;6 X4 y3 w/ T4 J
//已选择了range对象的取值:* T7 r2 n4 i) \* N  j! W* N
string strvalue= r.text;
4 W7 I+ u8 n" ?//未选择range对象的取值:- O  _0 n6 F0 h  T
string strvalue= mysheet.cells[1,2].text;- h# N) V3 m1 W" U# a0 n6 q2 T
③、给单元格设置边框
2 x! T/ p0 ~& Q$ r  Z6 M7 }" l7 Mmysheet.cells[2, 1].borderaround(xllinestyle.xlcontinuous, xlborderweight.xlthin, xlcolorindex.xlcolorindexautomatic, null);//画线! x- h5 w5 ]8 B6 E& Z$ m" K0 Q
④、合并单元格) e4 t( Q! |+ Z2 D' A& t- n/ q: u
//合并单元格前先要将要合并的单元格选择为range对象! V! e! b: _7 e; g# |" j# e
range r=range.get_range(a1:f3);4 B! a  J9 @, w! p+ R1 c
//然后现设置合并单元格$ n; i, s& j& J" H# Q* `/ B8 j& b# z
r.mergecells = true;4 y; T* F! M& d" g
⑤、设置单元格的字体、字号、背景色等属性7 J! \! T* h0 S; b
mysheet.cells[1, 1].font.name = 黑体;) |/ n, J9 ^# k, n) u  C# Z4 Z
mysheet.cells[1, 1].font.size = 20;
) ]& G" ^: l3 v+ F( ~6 q* Qmysheet.rows[1:1].rowheight = 40;
' [% |) M& U8 Wmysheet.cells[1, 1].interior.color = color.fromargb(224, 224, 224);//设置颜色
2 |8 c- I8 P' ]) g$ i( A$ l⑥、删除一行:9 R  T5 \5 t( T5 P3 ~# T
//首先获取要删除的行的range
9 }2 z3 N/ q' n$ Nmicrosoft.office.interop.excel.range range = (microsoft.office.interop.excel.range)mysheet.rows[sendedrow[1], type.missing];+ Z2 `( ?* g3 x0 p/ }
//注意删除行后删除后的行号被下面的行替换,如果逐行删除,请先从最大的行号往最小的行号删除
7 z1 z  v4 u' d6 `, S( ]7 t; Z7 P6 ]range.delete(microsoft.office.interop.excel.xldeleteshiftdirection.xlshiftup);
. ]8 K& B$ e: V, Z& @⑦、获取有数据的行数# [" k% J2 J' c& g, F
int rowsint = mysheet.usedrange.cells.rows.count;! B) ?0 x8 O& F6 `: ~
六、excel文件的保存与退出/ ~9 B8 x! B4 c$ t
1、excel的保存与退出" }. _% k* Z8 ~2 {
mybook.save();
; s; h7 Q) s$ [! _mybooks.close();
, O" l9 g$ k+ Xmyexcel.quit();
5 c- y6 i/ _) ^: O& N1 T6 H* |- B. g2、excel指定文件保存
. d- q; }4 a- b% K3 N* D9 z- _7 pmybook.close(true, filepath +_file_name, null);# K" D0 f% j+ {, Y
七、释放excle对象的资源与结束excel 进程# r( k+ e: g$ b0 b
关于这方面内容有好多网友都在讲多种方法,经过本人实践,以下方面才能真正做到结束excel的任务进程:
. I  H$ M# t' G# X9 w1、将所有以上对excel的操作放到一个方法中,( \: E6 q* d: I2 Y7 g0 V2 S
2、在操作excel后,即时将不使用对象一一释放并赋null值:
$ G+ K6 X, Y, o7 T2 h3 _system.runtime.interopservices.marshal.releasecomobject(mysheet);
' f  U- T# H. W# @mysheet=null;( ~: c9 B- y+ x7 K* z
system.runtime.interopservices.marshal.releasecomobject(mybook);( w( i& v( ^5 S
mybook=null;//http://www.111cn.net. }, J( B2 Z$ s2 U* d
system.runtime.interopservices.marshal.releasecomobject(mybooks);
. B4 S) n2 G0 Z. k& d- N2 hmybooks=null;
) C7 |% v* y0 p$ Vsystem.runtime.interopservices.marshal.releasecomobject(myexcel);
. r+ {  F( F# j# [3 Z. x0 Xmyexcel=null;
( z, f" Y; `5 e3 k( l" y, H3、再新建一个方法,并以该方法中执行上面新建的操作excel方法,并在执行完操作excel方法的后面添加gc.collect():1 O4 ^, f- u- O% A. }& F
//下面方法中outputexcel()方法是输出excel文件的对excel 操作的方法
/ o1 c' `+ a6 \, a% z6 Y/ s/ F0 lprivate void killexcel()& d8 L9 @4 K9 _! |8 W0 u" h$ V3 r
{  H7 A8 E8 I2 O, C8 e) i2 Q
outputexcel();/ v5 K6 }( G+ T$ w1 ?8 S
gc.collect();1 L& l# a5 _2 l/ Q2 V$ J" e+ s( @1 b
gc.waitforpendingfinalizers();8 s! I0 Y6 s4 k4 t/ o  W
}4 h- Q3 [. m- S1 p; Y! m9 x
好多网友都在介绍使用gc.collect()释放excel占用的资源来结束excel进行,如果将“gc.collect();”与操作excel的业务写在一个程序块中,“gc”是永远不能结束excel进程的,在web应用程序中,这种现象是很可怕的事情。原因是gc不会清理本程序块中的垃圾内存的。
1 V. A* |9 q, G. P: x4、在业务事件中调用killexcel()方法:
( f! q+ u5 M) }' h' h2 hprotected void linkbutton3_click(object sender, eventargs e)
; G  m& _$ k8 v' F2 J7 m{9 y1 p( F8 J/ x6 g8 q- M
//导出excel# O) M9 K% B' T, i% }8 T4 c
killexcel();. j( x! @9 Y2 r: `3 p" ~
}$ O0 _) y- Z' g# M8 h$ W7 K
八、一些权限的基本设置:  g4 d% N0 l' S& A8 O: I
使用以上方法在开发环境中调试程序没有一点问题,等发布到服务器上后,程序还是不能正常运行,需要进行如下的权限设置:
/ Y* u$ v- p" M: Z. ]6 [1、.net导出excel遇到的80070005错误的解决方法:
/ f7 p4 k: D' Q& E5 m$ @1 `检索 com 类工厂中 clsid 为 {00024500-0000-0000-c000-000000000046}的组件时失败,原因是出现以下错误: 80070005基本上.net导出excel文件,都需要如此配置一下,不配置有的时候没错,而配置后基本应该不会出错。6 \! g4 ?* W  G9 E
具体配置方法如下:
9 n4 ^2 K& {  ]4 V1:在服务器上安装office的excel软件.% v: v1 s* W5 S0 ~( Y6 W  H0 ^
2:在开始->运行中输入dcomcnfg.exe启动组件服务4 D5 n2 u- O- A# q
3:依次双击组件服务->计算机->我的电脑->dcom配置% P* @* i; I+ f9 _
4:在dcom配置中找到microsoft excel 应用程序,在它上面点击右键,然后点击属性,弹出microsoft excel 应用程序属性对话框* h- t# F6 }* _
5:点击标识标签,选择交互式用户# I1 S' i7 \; H) y% k, \
6:点击安全标签,在启动和激活权限上点击自定义,然后点击对应的编辑按钮,在弹出的安全性对话框中填加一个network service用户(注意要选择本计算机名),并给它赋予本地启动和本地激活权限.
4 V2 L0 X$ s! d3 f% S  J7:依然是安全标签,在访问权限上点击自定义,然后点击编辑,在弹出的安全性对话框中也填加一个network service用户,然后赋予本地访问权限.
3 T  X+ f1 |+ s' {# q9 I8.如果交互式用户设置后出现错误8000401a,可取消交互式用户,指定为administratr,可暂时解决此问题。进一步的解决方式还有待探讨。
/ Q+ Z+ r5 M0 N1 ^$ v! j& w9.采用第8点的设置后,打开excel可能会出现“无法使用对象引用或链接”,并且不能进行单元格粘贴。原因不明,取消设置后即可消失。
2 l# C: U" b: ~6 h3 G6 `1 F) a以上是本人在近期作开发时的一点心得,现整理成文档,供奋战在程序开发一线的朋友共享,愿看到的网友能名帮助解决“无法使用对象引用或链接”的问题。
, t" g2 F7 ]+ |4 `( t8 I8 I% e
/ O7 @; c% p, K) U更多网页制作信息请查看: 网页制作

回复|共 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 得知互动-专注Ai与站长技术交流社区-Ai交流平台 版权所有 All Rights Reserved. Powered by Discuz! X5.0 鄂ICP备15006301号-5|鄂公网安备 42018502006730号
关灯 在本版发帖 扫一扫添加QQ客服 返回顶部
快速回复 返回顶部 返回列表