返回列表 发新帖

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

364.2k 10
swmozowtfl 发表于 2015-7-18 00:12:19|湖北 | 查看全部 阅读模式
1、由dataset生成
0 w! q/ V  d* f. k4 l6 T8 J代码如下:0 |( Q6 i: s, K. _. e0 c
public void createexcel(dataset ds,string typeid,string filename)
* ?/ z; u& s. w4 ?" Z- q9 Z/ W{( K* U5 _+ _; n& V
httpresponse resp;
* a, ?6 d- E" i! A5 D8 U$ n$ |resp = page.response;. n, L0 o( }( ~' V6 b9 w
resp.contentencoding = system.text.encoding.getencoding(gb2312);
0 h% \: ]& p( ~3 B  T3 G1 a# `resp.appendheader(content-disposition, attachment;filename= + filename);  m5 _# J* u- U$ `( s  g  Y
string colheaders= , ls_item=;; p+ t, B- Z% e% G) D- R
int i=0;3 J3 O5 X7 s$ D$ P# }5 J' B
//定义表对象与行对像,同时用dataset对其值进行初始化
* X, Y/ y: N8 z1 @7 h3 |* Ldatatable dt=ds.tables[0];2 o( |% x. A& {# [
datarow[] myrow=dt.select();
* d. v( R1 V5 x+ y3 s0 p& ^7 Q- Y// typeid==1时导出为excel格式文件;typeid==2时导出为xml格式文件
, v2 ?/ N. k% V+ z& p4 Q4 M: fif(typeid==1)+ m: @2 V7 v; ?6 y0 n8 u
{
2 _; _  _3 m- p/ X//取得数据表各列标题,各标题之间以t分割,最后一个列标题后加回车符# V/ N  \/ L( F# e2 Z( Q" I& z
for(i=0;i colheaders+=dt.columns.caption.tostring()+t;
4 `. a% A# P5 D# R. c, Ycolheaders +=dt.columns.caption.tostring() +n;6 D* F. z: A" W9 k, f
//向http输出流中写入取得的数据信息: _$ R6 D6 C5 G
resp.write(colheaders);9 U% J" d" z' Y5 ~
//逐行处理数据
6 T2 A8 q! ^7 g% j5 g8 ]* rforeach(datarow row in myrow)& F3 h8 E% n% D2 Z: X" J  |# j- X
{
. T6 J9 N( T& l2 U//在当前行中,逐列获得数据,数据之间以t分割,结束时加回车符n
: v, u3 u2 q  W/ Yfor(i=0;i ls_item +=row.tostring() + t;( I8 V- H! J/ N
ls_item += row.tostring() +n;. f- w/ ^4 l# l/ A, U/ Y1 a4 E
//当前行数据写入http输出流,并且置空ls_item以便下行数据
7 P6 g  ?: e: P% B7 @/ p* tresp.write(ls_item);6 T# G) J, n3 F- D& q) s
ls_item=;2 w! y: `' V" [
}/ t2 s' l. O& k# D- i1 n
}, M' a6 Z  `, n' |
else! e5 G0 f& i' n+ M+ |2 x" v$ @% |: F7 T
{
7 {4 X1 L# D8 hif(typeid==2)$ j& M( P' e1 a( ?3 }; K! E
{# K9 A6 h8 a0 E8 _
//从dataset中直接导出xml数据并且写到http输出流中
4 p3 {  b7 n# zresp.write(ds.getxml());9 q9 q, }3 o! H" e9 w$ j- I1 e
}  ]/ C" w# i, I7 d5 t
}$ F/ f5 \% ~0 V" P
//写缓冲区中的数据到http头文件中3 A- I- v" w, _4 A) i" W4 z
resp.end();
( Z' _0 h  m7 ^( W" D1 R$ n}1 K6 e3 w- s. F& q. E' Q! n
2、由datagrid生成
* v4 s0 J6 `) h4 M2 [5 q5 m代码如下:* L( Y9 C1 @6 ]' ^9 v' }3 w, p  H
public void toexcel(system.web.ui.control ctl)
* ^2 L- d' t( t& D{+ T2 N4 t( t. q
httpcontext.current.response.appendheader(content-disposition,attachment;filename=excel.xls);
% B/ V1 [9 ^- s1 q0 \* u" Zhttpcontext.current.response.charset =utf-8;( e* A, z$ g+ q, [  H
httpcontext.current.response.contentencoding =system.text.encoding.default;9 @6 {, M7 E+ h. e5 j! F+ K/ T
httpcontext.current.response.contenttype =application/ms-excel;//image/jpeg;text/html;image/gif;vnd.ms-excel/msword
# v* K3 a  C$ K# y9 Lctl.page.enableviewstate =false;2 ^, }2 j* N; j+ u9 [3 }0 P
system.io.stringwriter tw = new system.io.stringwriter() ;5 S3 K1 p1 E! F' x
system.web.ui.htmltextwriter hw = new system.web.ui.htmltextwriter (tw);
0 l; m4 j/ K" c" X' Zctl.rendercontrol(hw);, J  W% D+ b* E2 e8 O" h! S* r
httpcontext.current.response.write(tw.tostring());  ?0 i- Z3 \! }+ Q2 m, \1 \* l
httpcontext.current.response.end();: H- d9 C! A! n  g* C
}
# B9 Y4 n2 }4 t; b3 y+ a2 h- E用法:toexcel(datagrid1);+ o+ k1 f9 {5 `' x4 r: W
3、这个用dataview3 u0 }+ f/ o* s' @+ b- p: \
代码如下:; |( u: z% m$ v4 z1 e/ l0 C" h
public void outputexcel(dataview dv,string str)! G- Z, q3 b* i8 b
{
. n% R6 g. Q6 s6 B//& b. M" Y& t8 b* E; t4 X: c
// todo: 在此处添加构造函数逻辑
% w! b& [7 N! a) O" Q//9 ?  N9 \, K6 b
//dv为要输出到excel的数据,str为标题名称" w" k! N' w: ^3 d1 g) K
gc.collect();
* A  v' s% f2 z% m! Z; R% [4 Eapplication excel;// = new application();, A$ |$ [5 |9 V! g) o
int rowindex=4;
& H6 t8 H" [8 w+ W" }: i1 }int colindex=1;: E2 Y! I8 J, [  J" n5 [
_workbook xbk;
/ a) A$ V4 ^( O0 {_worksheet xst;; L" P' }' j' F: ?! @) N
excel= new applicationclass();5 G9 L& M! w* s+ l" A/ h# u
xbk = excel.workbooks.add(true);6 c# ^$ a! v& Y2 _9 q; V' o
xst = (_worksheet)xbk.activesheet;
+ q  ~, [3 u. P) b" [! y//( w' k2 G- I' b4 P& P5 B
//取得标题
7 h1 P, N! j+ Z, @& R//
5 n+ ?, p( ]. p9 M* P6 E9 A- Jforeach(datacolumn col in dv.table.columns)( m! a. n4 ^8 o3 t) M6 `+ Z7 c
{
/ Y) E1 Q. m" }' ~, Icolindex++;0 r& d7 w5 C; S- C
excel.cells[4,colindex] = col.columnname;
6 C7 \! k  q2 i+ `5 n$ s( D  fxst.get_range(excel.cells[4,colindex],excel.cells[4,colindex]).horizontalalignment = xlvalign.xlvaligncenter;//设置标题格式为居中对齐
. x) j2 d4 s" D4 h, E/ ]}
6 f; D6 C& a2 ]% k, A/// J+ B9 E$ S' T: T
//取得表格中的数据
" i7 i2 }4 s( R6 V//- R7 R0 F+ ^, d1 Z3 X% u
foreach(datarowview row in dv)
) u: H% o1 C9 {6 l! }- ?{
$ M0 \+ k$ U& h8 y) krowindex ++;& h  e1 B7 ?, d7 z$ U# ^
colindex = 1;+ X. K8 Q" L& s
foreach(datacolumn col in dv.table.columns)# M. I% D3 r. O, m/ @% b" ^9 |
{' C9 ?5 l- Z( c& s
colindex ++;0 b5 ]/ N! W# m* V: i* T  x
if(col.datatype == system.type.gettype(system.datetime))
' Q; ]! B3 Y' ^9 Q5 a1 b{5 k5 q5 c0 r2 L+ y5 z
excel.cells[rowindex,colindex] = (convert.todatetime(row[col.columnname].tostring())).tostring(yyyy-mm-dd);
( d6 D  P# m  zxst.get_range(excel.cells[rowindex,colindex],excel.cells[rowindex,colindex]).horizontalalignment = xlvalign.xlvaligncenter;//设置日期型的字段格式为居中对齐
2 E. ~% i- f: [8 G# ^# h}
9 x, b: ~7 x  Y4 @else5 c, @, U! B" Z, L/ i7 m' b
if(col.datatype == system.type.gettype(system.string))
% ^4 K/ J3 i  s7 o{" ^& F. u  M: K) T2 D8 d
excel.cells[rowindex,colindex] = '+row[col.columnname].tostring();
+ j+ v& D3 R9 o# Z4 g3 Xxst.get_range(excel.cells[rowindex,colindex],excel.cells[rowindex,colindex]).horizontalalignment = xlvalign.xlvaligncenter;//设置字符型的字段格式为居中对齐
- M. Y5 f' W' h8 ^, E( p) C+ x4 A  I}/ A# b; j6 u0 }& Q
else0 N' R( I, x& m( W0 L' r, Q
{
* |/ O  @4 u. j' p. Mexcel.cells[rowindex,colindex] = row[col.columnname].tostring();
1 I7 w; M& ]1 W5 H/ ?}
1 S" J/ ~4 t8 d% j1 ?* m- y}, f2 g9 ~! H5 k: a! k
}6 W4 q* w5 ]* w) k/ G" v
//
7 \1 X( i: h# t7 k" W8 u$ @//加载一个合计行
* a5 w* {) n6 v; z- u0 O//
, n9 Z$ {( b  v2 `# @! Wint rowsum = rowindex + 1;
6 [7 T  S1 u: A* r! pint colsum = 2;
" L( q  C. P/ z( E( ?. texcel.cells[rowsum,2] = 合计;6 r; w0 I3 J$ d! o! R8 O" K$ ^
xst.get_range(excel.cells[rowsum,2],excel.cells[rowsum,2]).horizontalalignment = xlhalign.xlhaligncenter;
  Y( X7 Y6 }, q" }6 J+ n$ [" g1 p//8 h! v/ e9 r0 A+ n; T
//设置选中的部分的颜色) Q8 I, a+ l. ?( K" b1 f# x
//
0 `6 |8 E7 i: A& Y8 P. Wxst.get_range(excel.cells[rowsum,colsum],excel.cells[rowsum,colindex]).select();
9 f1 D- j- U( O2 m. Gxst.get_range(excel.cells[rowsum,colsum],excel.cells[rowsum,colindex]).interior.colorindex = 19;//设置为浅黄色,共计有56种1 K. g! b4 B* r# `
//& P: j/ i3 G2 u1 C
//取得整个报表的标题( @8 I  t, j6 s) _' ?  K2 y" ~
//: {& }7 C: H' G0 I
excel.cells[2,2] = str;
& Y4 F' Y2 H5 N9 ]7 b8 k8 a; L//7 T$ B( \9 ?0 R3 ], q( l" D
//设置整个报表的标题格式2 @3 k( A4 p3 I5 M
//
; K; n( @/ `; P* kxst.get_range(excel.cells[2,2],excel.cells[2,2]).font.bold = true;  O' D' M% K: H+ U0 X2 q$ k2 ]7 p
xst.get_range(excel.cells[2,2],excel.cells[2,2]).font.size = 22;
0 r% p/ u" m* W& Z7 c//
. T6 T; E/ M7 c- Z; c8 W* q//设置报表表格为最适应宽度  H+ n0 Q7 A  ^+ j
//
4 D/ s' K" u/ n. H/ I: n4 bxst.get_range(excel.cells[4,2],excel.cells[rowsum,colindex]).select();* ]& d2 @7 G, ], H
xst.get_range(excel.cells[4,2],excel.cells[rowsum,colindex]).columns.autofit();
8 W8 Y+ Y% U$ a$ `//1 N" o( @: q% n2 f2 G* ~8 Y
//设置整个报表的标题为跨列居中2 V2 L0 w  T7 P
//
5 Y1 n0 l" `$ pxst.get_range(excel.cells[2,2],excel.cells[2,colindex]).select();. E: U/ @6 |! ?. E) i$ H; F
xst.get_range(excel.cells[2,2],excel.cells[2,colindex]).horizontalalignment = xlhalign.xlhaligncenteracrossselection;' g0 N! D8 I0 R' X* d% ^2 ?) G
//
: }+ t( j2 y" F9 M//绘制边框
2 p$ r8 F7 ]5 @1 R5 n2 G/ Y& v//) E5 F5 N) N! z* l- O( W# ~
xst.get_range(excel.cells[4,2],excel.cells[rowsum,colindex]).borders.linestyle = 1;. y* B  L; b+ I. _- C* e5 ~  d
xst.get_range(excel.cells[4,2],excel.cells[rowsum,2]).borders[xlbordersindex.xledgeleft].weight = xlborderweight.xlthick;//设置左边线加粗
8 M2 k. T1 @' Z, N5 T4 ?xst.get_range(excel.cells[4,2],excel.cells[4,colindex]).borders[xlbordersindex.xledgetop].weight = xlborderweight.xlthick;//设置上边线加粗; q- G# J$ G0 I% O, ^  P
xst.get_range(excel.cells[4,colindex],excel.cells[rowsum,colindex]).borders[xlbordersindex.xledgeright].weight = xlborderweight.xlthick;//设置右边线加粗
( R: C2 H5 t/ sxst.get_range(excel.cells[rowsum,2],excel.cells[rowsum,colindex]).borders[xlbordersindex.xledgebottom].weight = xlborderweight.xlthick;//设置下边线加粗
7 c/ S" \: ^2 w# W7 e! ]7 Q1 X//! K5 k5 h  A2 g% G4 C
//显示效果
% R9 v6 L: N+ z//
. x5 e8 d- T! O: ]4 K; N+ Lexcel.visible=true;- D! Q  n' h4 D
//xst.export(server.mappath(.)++this.xlfile.text+.xls,
+ S/ p5 p. D0 n- X0 w; Msheetexportactionenum.ssexportactionnone,microsoft.office.interop.owc.sheetexportformat.ssexporthtml);& x0 l. }: E# T" K* T! c
xbk.savecopyas(server.mappath(.)++this.xlfile.text+.xls);
. _7 k2 x1 G  k8 _: C+ J7 Kds = null;
2 E+ [- I- y2 U0 L9 Z6 oxbk.close(false, null,null);5 _" ]: A& `! o& L2 q0 e6 ?
excel.quit();
3 j$ G3 [: s( M2 zsystem.runtime.interopservices.marshal.releasecomobject(xbk);) T& [+ e' S7 o/ l1 @. |
system.runtime.interopservices.marshal.releasecomobject(excel);
- m3 J, I. T# Tsystem.runtime.interopservices.marshal.releasecomobject(xst);
& n1 S; {+ j/ G/ s8 C9 sxbk = null;5 H9 h4 s6 |  f
excel = null;# L/ D/ m9 @0 y. j
xst = null;
5 w2 ?4 b. K$ T0 |3 W" G' bgc.collect();
8 `! T7 U& f$ ^: j7 E# |' R$ Rstring path = server.mappath(this.xlfile.text+.xls);1 d4 Q' F; |4 q7 N" ]+ T; d1 N! \3 x
system.io.fileinfo file = new system.io.fileinfo(path);- {) b; G* m# \
response.clear();* w+ G5 G. Y2 t, W: h1 P+ S7 k- ^
response.charset=gb2312;
; x3 }* a0 u* D/ h5 X3 @response.contentencoding=system.text.encoding.utf8;
0 H! L9 g' M4 N// 添加头信息,为文件下载/另存为对话框指定默认文件名
5 o) F0 ?# J% cresponse.addheader(content-disposition, attachment; filename= + server.urlencode(file.name));4 N( Q, d$ x2 q
// 添加头信息,指定文件大小,让浏览器能够显示下载进度
/ |+ r! |. ]' }9 L& Yresponse.addheader(content-length, file.length.tostring());
3 s" u  S* M4 F// 指定返回的是一个不能被客户端读取的流,必须被下载
/ q+ z+ z* _% i; c4 Aresponse.contenttype = application/ms-excel;% }/ c% ]4 A6 n) b/ U  n, I- i
// 把文件流发送到客户端8 g! h  ~! F+ K) x0 ?) F( A; c  _
response.writefile(file.fullname);
3 Y8 ~/ A+ {" Z: o// 停止页面的执行
0 k" p5 m7 R! d+ V; x; Vresponse.end();
( P' B( m: ?" O4 ]: ~}) N5 u  ]: }5 g: }, j  P
导入、导出excel中的一些问题汇总- `: X+ C' {# D+ F, c
一、在项目中的添加引用:& L% j, w& _8 b! [1 e: w
右击项目资源管理器的引用-->添加引用-->选择.net选项卡-->选择microsoft.office.interop.excel-->确定(如下图);
2 Y5 a7 H# |6 K. j在选择时注意一下.net组件的版本号,图是的12.0.0.0是office2007的版本:3 U4 L* w" H) h: \( D& n
二、在项目中使用microsoft.office.interop.excel:  L7 }7 k2 t5 ]
如果想使用microsoft.office.interop.excel,首先需要在项目中引用命名空间:
  z- }" W0 X3 gusing microsoft.office.interop.excel;
7 @. G0 W& d! Y4 j* `( v三、建立excel.application相关对象$ {  W% q3 y' w$ M: Y
//建立application对象
; a1 E& U1 `7 g& Imicrosoft.office.interop.excel.application myexcel = new application();8 [. R4 ]1 D4 @8 R; x1 n4 w, @3 o
//建立workbooks对象
* x2 M- m2 E, P# Qworkbooks mybooks = myexcel.application.workbooks;
5 e6 n; n! |& e; P; o4 p//建立一个system.reflection.missing的object对象# e' ?6 G4 y+ U5 r; ]; \8 C# P8 {5 I
object omissing = system.reflection.missing.value;) D3 D$ ~1 C6 _+ Q
四、打开或新建excel的book文件
7 |% k5 I) u$ c, v//打开excel文件,注意里的“exccelfilepath”为excel文件在服务器上的物理地址,包括文件名; U4 y( U# h/ X. c: {' Z# _! }5 A
workbook mybook = mybooks.open(exccelfilepath,omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing);
4 X8 X. }9 V! Z8 {: ~6 k//新建workseet对象,,此处为要操作的工作表 ,当前要操作的工作表的获取方法有两种:使用工作表的索引值或使用工作表的名称,名称默认为:“sheet1”/“sheet2”等& ~5 D: |; |9 A* j* w1 s7 Q
worksheet mysheet = (worksheet)mybook.worksheets[1];* B7 f$ H* V& V  m2 g
//如果是新建excel工作簿,需要 设置如下两行内容,以保证工作簿中有一个工作表,
% I# x* Z$ R, b' p6 dworkbook workbook1 = excel1.workbooks.add(true);- n# H& V( O: u- ^& M, H
worksheet mysheet= (worksheet)workbook1.worksheets[sheet1];  Y* W3 q) v8 H+ J  E2 l! N
//设置excel对象是否显示界面,默认为false不显示界面
* I) J. I6 I! h, H" Jmyexcel.visble=true;
8 D  D6 |7 U9 t' }! i$ x五、一些比较重要的针对excel的操作
% d! h0 Z" g+ g, ^; C  T1、获取range对象# ]' N7 Q: X5 ~& L
①、获取一个单元格的range对象:$ s6 l8 Z1 t: J0 g  J5 T( t8 D$ e
//选择第一行、第一列的单元的单元格为range对象9 n: S" m0 w- O1 z9 {4 s& e4 _1 ~8 M
range r = (excel.range)mysheet.cells[1, 1];: L2 n* P* h4 g; }6 P+ m
//选择多个连续的单元格为range对象- g- l7 k. m& T
range r=(excel.range)range.get_range(a1:f3)- a: u' d& r; P! Q( o
②、给单元格赋值或取出单元格的值:, t2 ?7 T: a2 }& L5 D" o
//已选择了range对象的赋值:, ?6 C9 ~4 }$ g- b
r.text=中国;3 p& [' y6 @. N5 S& e2 U7 M
//未选择range对象的赋值:3 ^$ P) N1 G. X
mysheet.cells[1,2].text=中国;  Z0 m5 ], y& n1 B7 {* C
//已选择了range对象的取值:
; A! y3 V# j4 s4 O5 C9 \7 @3 kstring strvalue= r.text;, t2 C$ U+ i( o: r
//未选择range对象的取值:# [, J- p" n1 O8 p' [' w
string strvalue= mysheet.cells[1,2].text;! a7 d  m; {- x& D; {& S
③、给单元格设置边框
6 Y( R: J' b$ A, Nmysheet.cells[2, 1].borderaround(xllinestyle.xlcontinuous, xlborderweight.xlthin, xlcolorindex.xlcolorindexautomatic, null);//画线
$ i( s3 @2 ?  ]4 |* w; l1 R④、合并单元格/ `4 ^9 i* H, x9 @0 e/ y4 M# d
//合并单元格前先要将要合并的单元格选择为range对象
( h0 Z* g6 V; n/ Vrange r=range.get_range(a1:f3);
2 c8 Q8 f0 j3 @: E8 k/ n6 G//然后现设置合并单元格
+ b# b* C( j! s$ ?2 S- [% qr.mergecells = true;- N& |! g* ^3 u( N
⑤、设置单元格的字体、字号、背景色等属性- E8 L' x/ o% a0 z. [
mysheet.cells[1, 1].font.name = 黑体;
2 H! {% M/ x+ Y" p2 Smysheet.cells[1, 1].font.size = 20;7 p4 M1 D& I' C& }* X" n
mysheet.rows[1:1].rowheight = 40;3 n9 e- L, W/ {" w* J, ^0 J- N
mysheet.cells[1, 1].interior.color = color.fromargb(224, 224, 224);//设置颜色2 o- |. M. G+ H/ T, x
⑥、删除一行:" }. C% m" B2 s
//首先获取要删除的行的range
. v: }9 L  ~# p% emicrosoft.office.interop.excel.range range = (microsoft.office.interop.excel.range)mysheet.rows[sendedrow[1], type.missing];  A$ H% E3 \. T, q; J
//注意删除行后删除后的行号被下面的行替换,如果逐行删除,请先从最大的行号往最小的行号删除
: ?- X5 Y1 v3 l, Jrange.delete(microsoft.office.interop.excel.xldeleteshiftdirection.xlshiftup);- W  w' `$ N7 n1 N" }! G
⑦、获取有数据的行数8 h. q3 t  p! G9 j6 `
int rowsint = mysheet.usedrange.cells.rows.count;5 l2 Y$ H9 ^# [4 ]- a* N
六、excel文件的保存与退出
$ H4 Y9 x5 a" Z1、excel的保存与退出
% m* W; w- k# pmybook.save();
3 f. I+ L! p  ]! B9 a- Q% cmybooks.close();
9 ~/ S# ?; a1 S; E9 h5 \$ x9 Tmyexcel.quit();
1 x, G7 ~" T4 V4 e, m2、excel指定文件保存
' W: O: Q: R, H$ ^% @% imybook.close(true, filepath +_file_name, null);5 [  w* t8 q* p/ Z+ R5 M
七、释放excle对象的资源与结束excel 进程7 i7 b; X' r1 N) q. [2 b7 j
关于这方面内容有好多网友都在讲多种方法,经过本人实践,以下方面才能真正做到结束excel的任务进程:
+ t- k1 }* G! t# ^; D1、将所有以上对excel的操作放到一个方法中,0 _; z, i! T& x9 s. c: r6 C
2、在操作excel后,即时将不使用对象一一释放并赋null值:
* B( H/ u" m' u0 q" wsystem.runtime.interopservices.marshal.releasecomobject(mysheet);& T6 B1 E( u5 v; Q# d; |/ M
mysheet=null;
/ _* S+ |! T, E$ _5 T3 P/ \system.runtime.interopservices.marshal.releasecomobject(mybook);0 C( }. b: c( ^) n) X4 Y
mybook=null;//http://www.111cn.net
& J+ r3 ~; _) [5 vsystem.runtime.interopservices.marshal.releasecomobject(mybooks);# d* e5 o6 z" W( M0 j; t" v
mybooks=null;
4 o: t' ]5 C8 w" Gsystem.runtime.interopservices.marshal.releasecomobject(myexcel);% F: r. m6 a+ N: l& b& r6 _$ t
myexcel=null;: Q. a0 E- J$ M* l  h9 Z8 Z
3、再新建一个方法,并以该方法中执行上面新建的操作excel方法,并在执行完操作excel方法的后面添加gc.collect():
* b7 v. u0 M/ O0 ?4 x//下面方法中outputexcel()方法是输出excel文件的对excel 操作的方法
3 R8 V8 \7 ?% I" l3 `private void killexcel()
) P* z) X0 w8 A4 w+ K) e; d{
# I. m" Z$ v  R7 ?outputexcel();1 m% d, @0 r& e# i/ H  ^
gc.collect();4 h- ]) W5 {' @7 u
gc.waitforpendingfinalizers();, u) ?: E0 h0 i1 Q! j) c% {
}6 W6 Z$ K" d3 o5 H% u3 }
好多网友都在介绍使用gc.collect()释放excel占用的资源来结束excel进行,如果将“gc.collect();”与操作excel的业务写在一个程序块中,“gc”是永远不能结束excel进程的,在web应用程序中,这种现象是很可怕的事情。原因是gc不会清理本程序块中的垃圾内存的。8 ~: I& N6 B% V- g9 x2 R% M( ~
4、在业务事件中调用killexcel()方法:; A/ u8 y7 ~- B0 V' c
protected void linkbutton3_click(object sender, eventargs e)2 _: V; O7 j, q1 U
{2 {% q' r6 }. b7 r1 o3 B
//导出excel1 u5 S% W" c* V- d# q! r, N
killexcel();. t% U5 Y1 j% G
}
5 W! R8 W, _# U& \3 ?八、一些权限的基本设置:
  w" O* C- X1 h3 S& |使用以上方法在开发环境中调试程序没有一点问题,等发布到服务器上后,程序还是不能正常运行,需要进行如下的权限设置:
# p6 Z- o" M  Q0 s- [* p, L1、.net导出excel遇到的80070005错误的解决方法:4 p- q7 E% U; c2 c
检索 com 类工厂中 clsid 为 {00024500-0000-0000-c000-000000000046}的组件时失败,原因是出现以下错误: 80070005基本上.net导出excel文件,都需要如此配置一下,不配置有的时候没错,而配置后基本应该不会出错。9 L. E5 \: U6 j. a- @7 H5 }
具体配置方法如下:! {3 u) m/ p. d- b* K
1:在服务器上安装office的excel软件.
$ q" Q0 I" x- F2 m& g. i! a% x2:在开始->运行中输入dcomcnfg.exe启动组件服务
; q6 i& d. z) I+ d% Z3:依次双击组件服务->计算机->我的电脑->dcom配置0 I+ Y0 l5 D! d$ _1 ?) ?
4:在dcom配置中找到microsoft excel 应用程序,在它上面点击右键,然后点击属性,弹出microsoft excel 应用程序属性对话框. ~: v2 `& [1 m& {  s- r6 K
5:点击标识标签,选择交互式用户
( s. g' @: e% |6 A9 v; n6:点击安全标签,在启动和激活权限上点击自定义,然后点击对应的编辑按钮,在弹出的安全性对话框中填加一个network service用户(注意要选择本计算机名),并给它赋予本地启动和本地激活权限.5 p: j9 A3 a3 ?4 r# M' C$ n
7:依然是安全标签,在访问权限上点击自定义,然后点击编辑,在弹出的安全性对话框中也填加一个network service用户,然后赋予本地访问权限.7 @1 I+ \* Z% a3 j  M
8.如果交互式用户设置后出现错误8000401a,可取消交互式用户,指定为administratr,可暂时解决此问题。进一步的解决方式还有待探讨。# M/ O! r' a& B' i/ R  j9 B
9.采用第8点的设置后,打开excel可能会出现“无法使用对象引用或链接”,并且不能进行单元格粘贴。原因不明,取消设置后即可消失。
/ V# a! p  ?0 O1 P4 H4 h2 P以上是本人在近期作开发时的一点心得,现整理成文档,供奋战在程序开发一线的朋友共享,愿看到的网友能名帮助解决“无法使用对象引用或链接”的问题。
* A1 N. @8 g# U* o+ s% F" x$ ^+ f! }
更多网页制作信息请查看: 网页制作

回复|共 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客服 返回顶部
快速回复 返回顶部 返回列表