返回列表 发新帖

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

364.2k 10
swmozowtfl 发表于 2015-7-18 00:12:19|湖北 | 查看全部 阅读模式
1、由dataset生成9 `, o  m" k8 e/ i/ C; e
代码如下:
- C* o: }5 A2 f9 z# h2 d  p, d
public void createexcel(dataset ds,string typeid,string filename)
! ^& X& y  }  Y8 j{
. _! K6 f- O& u) Fhttpresponse resp;
  Y# U7 g3 \; y) Dresp = page.response;3 E; X0 a- W  s7 g7 S3 A
resp.contentencoding = system.text.encoding.getencoding(gb2312);
7 ~/ B" r1 t7 A/ j6 Uresp.appendheader(content-disposition, attachment;filename= + filename);, p5 m& {; `4 p" I) [9 d# o+ ^9 _
string colheaders= , ls_item=;
- q' `' v5 i1 \; K1 d/ Uint i=0;
  w# E' p$ R/ o$ `+ u4 |//定义表对象与行对像,同时用dataset对其值进行初始化" x3 e5 Y" z. a8 g" [3 x8 B. A/ n
datatable dt=ds.tables[0];
2 Y' s5 w, F' O# H. g2 Mdatarow[] myrow=dt.select();; V! u: t! O2 l0 @
// typeid==1时导出为excel格式文件;typeid==2时导出为xml格式文件+ u# s4 Q9 {, W: N7 t; O& f3 ^
if(typeid==1)% w, C: D- ]- X; l! i) E/ ^
{: `2 b) \6 z' L; _+ [
//取得数据表各列标题,各标题之间以t分割,最后一个列标题后加回车符$ U  @7 I/ _+ {  P# q8 I0 r
for(i=0;i colheaders+=dt.columns.caption.tostring()+t;$ Y; t+ V3 C6 V* W+ Y
colheaders +=dt.columns.caption.tostring() +n;* `: E! d' M# n$ o
//向http输出流中写入取得的数据信息; ?1 Z- }7 ]& U. }8 \+ r5 u
resp.write(colheaders);
: Q8 X' U4 I/ m* c: O//逐行处理数据
* |" }; `+ ~* Z$ D0 E7 ^, xforeach(datarow row in myrow)- [! [7 a/ O+ Q! G. \) @; I/ G
{
' Y, h' e: |" b, A//在当前行中,逐列获得数据,数据之间以t分割,结束时加回车符n
; \7 Z6 \  P9 U+ j  B1 xfor(i=0;i ls_item +=row.tostring() + t;9 j* F+ ]" \2 ^# ?
ls_item += row.tostring() +n;5 g( i5 M" |: ?% M% g. |8 F
//当前行数据写入http输出流,并且置空ls_item以便下行数据
8 a$ `( Y2 I6 C. F1 \1 w$ ?. u) Eresp.write(ls_item);
  I4 [4 ]0 }: h& Bls_item=;( r" d# u  p& |- t+ C
}
: o* r: W2 J9 C% J( J1 L}
: s3 A8 {6 F' Pelse
) a0 J* n0 F1 |{$ [0 j- S2 m5 o6 S
if(typeid==2)
" \, t5 w) Q/ e( c% N8 G/ @5 L# _{0 h2 N. Z7 J0 B
//从dataset中直接导出xml数据并且写到http输出流中+ b+ [3 Z& t% ^9 E/ D4 f
resp.write(ds.getxml());
' d% E. B! T. X* x}
3 Y9 m& K( s9 \8 @# q! R}
- }2 a* Z, [+ F//写缓冲区中的数据到http头文件中
1 m/ @1 z3 v* ]# T  vresp.end();/ U0 z. z7 C0 t6 ~; z
}
$ n' _+ B3 u: R& ?2、由datagrid生成. }% ]' ?  t2 L3 W
代码如下:
. p' x7 U6 ^' v8 \  H, s2 \5 x
public void toexcel(system.web.ui.control ctl)
* \. z, t1 Q0 K. d) q' I0 H5 X7 V{
0 j9 n9 y" q: Z( m- l/ K' j9 Khttpcontext.current.response.appendheader(content-disposition,attachment;filename=excel.xls);6 m# [8 P2 s# @  R9 W# u$ m3 a
httpcontext.current.response.charset =utf-8;0 g: X7 g3 h$ e& t" `, c1 H
httpcontext.current.response.contentencoding =system.text.encoding.default;
  e4 P3 z9 f8 Q/ \' m" Shttpcontext.current.response.contenttype =application/ms-excel;//image/jpeg;text/html;image/gif;vnd.ms-excel/msword$ {" M4 ~/ c1 d- f$ `# E5 v1 h
ctl.page.enableviewstate =false;# X; k- h) z  P4 S
system.io.stringwriter tw = new system.io.stringwriter() ;. j% M" @9 }2 D/ C; `; \  Y5 h
system.web.ui.htmltextwriter hw = new system.web.ui.htmltextwriter (tw);) D4 X5 U9 R5 T9 L- R  X  g
ctl.rendercontrol(hw);- _$ c, _5 l1 R, k
httpcontext.current.response.write(tw.tostring());
. x# A2 z& t& T9 Q, o  e9 G( Zhttpcontext.current.response.end();1 |5 y3 u! ]+ k7 b
}
4 C( ^9 J- k' l5 _4 Y$ ?7 ]! _用法:toexcel(datagrid1);! R* F! }9 b) E) G
3、这个用dataview
& s. o( {$ e- L& J代码如下:4 P* u  E' \# i: a. s$ _4 A. |) p
public void outputexcel(dataview dv,string str)
7 {8 v6 S2 w1 G7 M& v{
# z9 d: I. S+ a7 I9 {" G+ {//
0 s4 N( p0 [) f& y// todo: 在此处添加构造函数逻辑$ ^! e) Y! T, Y7 f6 G0 l
//. a$ z/ o# j6 _# X
//dv为要输出到excel的数据,str为标题名称5 v& I% F2 J% t' n  _6 g# D0 d1 s
gc.collect();
  y! x. K! m; o5 \' Gapplication excel;// = new application();
, J7 k( M9 k4 v6 m& Cint rowindex=4;
$ e' Q: z  T7 A6 e& e. z9 Iint colindex=1;
  i2 t/ X& {, F$ k* h1 N- V4 f: T' [_workbook xbk;" w+ e/ c2 p" x6 Z) u& w0 S# B
_worksheet xst;0 V0 Y& w5 i( b
excel= new applicationclass();: F3 q( P  }, p. \
xbk = excel.workbooks.add(true);
$ ~+ r5 O- H$ Q" `8 bxst = (_worksheet)xbk.activesheet;
' C! x. u" H3 e# }3 m5 b//9 ^: F- b6 F0 O
//取得标题
! \; Q3 a: e, z" \, t7 }$ o, R3 h# J2 D//
$ S5 f6 Y7 F3 n3 H8 C$ M$ i( yforeach(datacolumn col in dv.table.columns)
  U7 F, V, ]) g" x6 {5 I5 |{
5 `  x4 R4 ^( G  U8 xcolindex++;
  K8 Y9 M" W, N5 y# N: aexcel.cells[4,colindex] = col.columnname;; U2 e* m+ y$ s. _: j. q7 j
xst.get_range(excel.cells[4,colindex],excel.cells[4,colindex]).horizontalalignment = xlvalign.xlvaligncenter;//设置标题格式为居中对齐
% I4 \4 |1 e  q+ U3 L6 A}
# M+ S4 Z3 ]% ]//
+ J6 w# k' b! Y" h//取得表格中的数据: C8 a9 T4 A  a  V) n! e' U
//
2 {" J" l7 @- X  j: wforeach(datarowview row in dv)
; u. |# O8 M2 f" J/ S3 X4 M1 {{
# o: c+ T) P+ Y; _0 i8 w, @rowindex ++;) D1 m$ z2 m$ M* q5 ~4 ]6 _
colindex = 1;
% X, W( T% y  `foreach(datacolumn col in dv.table.columns)* R0 e0 a. o) u! u3 m+ T
{) |7 ~- j# W7 G: v  m. t- x
colindex ++;
3 h+ L, u2 ~& ?+ e; w9 jif(col.datatype == system.type.gettype(system.datetime))6 O5 F. W4 }3 A0 b1 O" r
{
1 E& C0 a6 N" C9 ?5 I# Vexcel.cells[rowindex,colindex] = (convert.todatetime(row[col.columnname].tostring())).tostring(yyyy-mm-dd);
+ P* u6 v' S8 o' ]xst.get_range(excel.cells[rowindex,colindex],excel.cells[rowindex,colindex]).horizontalalignment = xlvalign.xlvaligncenter;//设置日期型的字段格式为居中对齐
+ u7 a3 T; y1 C5 o& \# f/ w) {}
/ E$ n" N* d& C3 D$ Pelse$ x1 q8 ]( u5 ~; K3 L) ?. R
if(col.datatype == system.type.gettype(system.string)); H8 m" j: E& _7 F% b# l0 N0 X
{# H1 q( u- M5 R; R* E* l
excel.cells[rowindex,colindex] = '+row[col.columnname].tostring();
7 S1 @- e9 h5 C" axst.get_range(excel.cells[rowindex,colindex],excel.cells[rowindex,colindex]).horizontalalignment = xlvalign.xlvaligncenter;//设置字符型的字段格式为居中对齐
, }5 ~1 o* I4 q+ R, [5 U) [}
/ f) I/ m# M, H1 ?+ u1 @1 delse6 l- J7 H5 S+ a6 Z5 B8 B" w8 ]+ p
{
" l- C# M2 f9 J" H' E% Hexcel.cells[rowindex,colindex] = row[col.columnname].tostring();2 ~- z' B  Q- G# t& V
}! t$ K  }+ G4 D
}* W, l) O& M. Y. L+ v
}/ @4 c# M: F3 n/ E/ {* [
//
1 G; \1 L2 h+ F6 [" u. q//加载一个合计行
5 |5 A8 H' Q, q8 A) b0 \//( m7 l+ h& X8 y+ f# e, F
int rowsum = rowindex + 1;, I- w1 k+ K  O) p$ Q# p
int colsum = 2;
- ^5 L7 @( h: V5 m1 Jexcel.cells[rowsum,2] = 合计;
$ K0 P/ s  `1 L( Z# C1 Sxst.get_range(excel.cells[rowsum,2],excel.cells[rowsum,2]).horizontalalignment = xlhalign.xlhaligncenter;
5 e# _: U! ~* K, D* e( V/ |7 j/ p//
( O  L" f' J, z; E2 S8 O+ `//设置选中的部分的颜色
7 I2 a$ t* R) R* a//& t- {, K9 f* a- T$ j% T/ _
xst.get_range(excel.cells[rowsum,colsum],excel.cells[rowsum,colindex]).select();
0 C4 V. E% G5 Q/ R; Dxst.get_range(excel.cells[rowsum,colsum],excel.cells[rowsum,colindex]).interior.colorindex = 19;//设置为浅黄色,共计有56种
! F' Q' L6 f# B6 |: y1 E+ c3 H//
) i4 L) q# ~& e3 y# h1 \/ l//取得整个报表的标题' S, Y2 m4 J( M5 E9 b+ Y% L' b: P
//; V8 y' d% u# X* A: b7 }
excel.cells[2,2] = str;1 x/ ^4 O' g2 U- a& b4 d
//
  r4 b8 f' M4 I: e. M//设置整个报表的标题格式
. m7 e5 J% j. c- N" J6 V6 T& l& k//. W+ |- C: {4 c
xst.get_range(excel.cells[2,2],excel.cells[2,2]).font.bold = true;
/ L4 A: z" K, \/ H- s4 T; bxst.get_range(excel.cells[2,2],excel.cells[2,2]).font.size = 22;
* E* Z( Z2 E: p% G) m2 d; M+ j6 R5 ]//
$ p5 z5 \  F1 S/ d$ s6 o9 ~% n: t0 W//设置报表表格为最适应宽度
, U% z( L  M/ R6 i/ |8 l//2 t6 I9 g! {) f( \- S. m* _4 }
xst.get_range(excel.cells[4,2],excel.cells[rowsum,colindex]).select();
, ^/ q9 u1 x3 V6 @' h0 N/ f0 u$ G+ K& _xst.get_range(excel.cells[4,2],excel.cells[rowsum,colindex]).columns.autofit();
! y, x; G) z" p; M8 O0 F//
6 U; U+ _! t* m  j. j& q) D) e) e/ {//设置整个报表的标题为跨列居中. |" L6 D, J0 I6 K
//  r' ^  i/ R6 t9 O
xst.get_range(excel.cells[2,2],excel.cells[2,colindex]).select();
3 Z, U$ D+ @7 n3 A6 gxst.get_range(excel.cells[2,2],excel.cells[2,colindex]).horizontalalignment = xlhalign.xlhaligncenteracrossselection;
2 W+ d5 \5 T! z3 u- c//
8 g: d$ a( B) `/ a2 U//绘制边框# J- P) m, i' I6 R2 E9 q
//; Q0 S' W! p) N3 e) z8 v
xst.get_range(excel.cells[4,2],excel.cells[rowsum,colindex]).borders.linestyle = 1;
, U0 j# B0 X. _# l8 ixst.get_range(excel.cells[4,2],excel.cells[rowsum,2]).borders[xlbordersindex.xledgeleft].weight = xlborderweight.xlthick;//设置左边线加粗
6 W2 m: J9 S0 [, \0 W2 Gxst.get_range(excel.cells[4,2],excel.cells[4,colindex]).borders[xlbordersindex.xledgetop].weight = xlborderweight.xlthick;//设置上边线加粗
  o) C- k+ V4 w/ jxst.get_range(excel.cells[4,colindex],excel.cells[rowsum,colindex]).borders[xlbordersindex.xledgeright].weight = xlborderweight.xlthick;//设置右边线加粗7 G5 V# ?1 |# p- c1 F
xst.get_range(excel.cells[rowsum,2],excel.cells[rowsum,colindex]).borders[xlbordersindex.xledgebottom].weight = xlborderweight.xlthick;//设置下边线加粗
; c# r3 f, L, c) H9 s+ O( U//
& x- J0 V# p3 N4 m//显示效果2 _5 B+ X* D- c7 p: o& @
//
; e7 R5 b: g' d9 Z; y: I# L; `: L& ^" Zexcel.visible=true;# @& |4 {( x$ z) H/ X
//xst.export(server.mappath(.)++this.xlfile.text+.xls,
. _/ I5 _  q) m( \, x1 e% Msheetexportactionenum.ssexportactionnone,microsoft.office.interop.owc.sheetexportformat.ssexporthtml);+ t$ l" c8 Q: ~
xbk.savecopyas(server.mappath(.)++this.xlfile.text+.xls);
& K* V0 ]8 `4 L  ]$ _/ k/ Uds = null;& G3 y0 j$ G4 v! X* ~! M" @7 _3 K
xbk.close(false, null,null);
& I6 g' f3 e/ ?, i" T  oexcel.quit();' K% r: L' H3 {( }2 l* a2 t
system.runtime.interopservices.marshal.releasecomobject(xbk);0 e! \/ A/ J) c4 d+ d
system.runtime.interopservices.marshal.releasecomobject(excel);
. e! ^1 Y& b& a: r. Z. x8 G% F% msystem.runtime.interopservices.marshal.releasecomobject(xst);5 m( N8 \) p6 e
xbk = null;( R; h" C! O; ?/ v
excel = null;+ l* f; k: t: v: q1 |, C; s
xst = null;" e& T' v# |: v0 g' ~% e4 c- \
gc.collect();9 s$ _; O8 B# a. R0 t
string path = server.mappath(this.xlfile.text+.xls);
6 G% e1 Q3 @3 t5 M' Y5 Ksystem.io.fileinfo file = new system.io.fileinfo(path);8 W! Q  L, E* i
response.clear();
' d' M2 \% f: `/ p; U+ T* mresponse.charset=gb2312;
$ @2 l: p/ [! D( S0 X: Dresponse.contentencoding=system.text.encoding.utf8;& R4 S$ `. {# F9 O- x
// 添加头信息,为文件下载/另存为对话框指定默认文件名
0 L2 L/ I& n3 Y9 G, ^" z) _8 Tresponse.addheader(content-disposition, attachment; filename= + server.urlencode(file.name));5 G+ C' k2 c) [, i6 ?
// 添加头信息,指定文件大小,让浏览器能够显示下载进度0 I4 G. a+ c, l7 Q/ _% T" h1 M
response.addheader(content-length, file.length.tostring());
9 a+ C) @- U& i3 h' y+ ?/ B// 指定返回的是一个不能被客户端读取的流,必须被下载
% h4 o5 X5 r- F% m0 eresponse.contenttype = application/ms-excel;! ^: O& x  g  M3 z$ ~3 G0 T& g7 k/ b1 x
// 把文件流发送到客户端
6 A3 r8 ]" p# Rresponse.writefile(file.fullname);
; T5 E* V& Q( `- Y! p( W. y// 停止页面的执行; N4 `* b6 L8 r9 r4 o, D
response.end();1 Y& L+ f; x$ V7 X  K$ |% Y
}
5 O( I% ~3 ^% ]/ J7 @7 r导入、导出excel中的一些问题汇总
2 ~# X6 c) p2 O' Q一、在项目中的添加引用:
: o. ~. ?! S* Y' B+ v右击项目资源管理器的引用-->添加引用-->选择.net选项卡-->选择microsoft.office.interop.excel-->确定(如下图);" d& E9 F+ j+ ]* C% F5 ?* K
在选择时注意一下.net组件的版本号,图是的12.0.0.0是office2007的版本:0 i3 k( ~' u- m
二、在项目中使用microsoft.office.interop.excel:& @/ E. H+ f& I7 N$ \
如果想使用microsoft.office.interop.excel,首先需要在项目中引用命名空间:
# a0 T: |# h% M( ]! D% rusing microsoft.office.interop.excel;+ @- I: E! Q+ h' g. }$ H
三、建立excel.application相关对象
* F8 E1 R9 O* H" J, |+ h! ]//建立application对象. P+ R* X% D; P) ~( T- |/ |
microsoft.office.interop.excel.application myexcel = new application();
" K; \9 U5 w! l5 a+ S" w/ D5 Q3 ~//建立workbooks对象
0 v- h* p' g& s7 Z$ Z. cworkbooks mybooks = myexcel.application.workbooks;
8 i) p+ c. g: b  ?' S//建立一个system.reflection.missing的object对象
( H8 S1 h* v+ @# Dobject omissing = system.reflection.missing.value;
* V, ~- k! n0 c% g四、打开或新建excel的book文件  @8 ?# L' d( e& S  ^
//打开excel文件,注意里的“exccelfilepath”为excel文件在服务器上的物理地址,包括文件名0 Q/ u" t% Z, H' @
workbook mybook = mybooks.open(exccelfilepath,omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing);
7 R; C! b& c: V5 u7 o//新建workseet对象,,此处为要操作的工作表 ,当前要操作的工作表的获取方法有两种:使用工作表的索引值或使用工作表的名称,名称默认为:“sheet1”/“sheet2”等& }: A8 |2 W  b4 s
worksheet mysheet = (worksheet)mybook.worksheets[1];/ n; P: |, O& [, I5 ^
//如果是新建excel工作簿,需要 设置如下两行内容,以保证工作簿中有一个工作表,
2 Z' U& Z- {) U5 G% \4 X/ vworkbook workbook1 = excel1.workbooks.add(true);" V* f: S0 B9 D, V' m4 ?
worksheet mysheet= (worksheet)workbook1.worksheets[sheet1];
& ~+ \6 B2 _/ n. J! U; x//设置excel对象是否显示界面,默认为false不显示界面: F1 a" c1 x' G# Q
myexcel.visble=true;. X* u! N* F  H( _! ^7 G
五、一些比较重要的针对excel的操作9 n" K$ |- }$ U
1、获取range对象
- U- m5 U. y8 _( b+ ~0 y①、获取一个单元格的range对象:7 n9 G; d  ^6 p7 o7 ?3 A
//选择第一行、第一列的单元的单元格为range对象7 F) A7 x6 b8 Q: J/ r
range r = (excel.range)mysheet.cells[1, 1];3 a' [- i& B  d# {6 Q. c9 _5 s' y# Y( h
//选择多个连续的单元格为range对象: R% m0 O8 E" @) S0 l
range r=(excel.range)range.get_range(a1:f3)
% j9 m% k! @/ a; F( T" x% M②、给单元格赋值或取出单元格的值:! P  X- h4 w( {4 }- K: y
//已选择了range对象的赋值:
6 W9 e; q' W9 E/ i( ]r.text=中国;
, U, y) n9 \5 e0 ]7 Q//未选择range对象的赋值:
" E5 L% R9 E$ ?0 u4 R. Pmysheet.cells[1,2].text=中国;
0 ?) e- A  ]8 T//已选择了range对象的取值:
" [  Y. G( T. A1 ], bstring strvalue= r.text;
! o) p1 p; S4 A! |6 _//未选择range对象的取值:7 }% F1 j8 u7 Y( H9 ?
string strvalue= mysheet.cells[1,2].text;# t5 s( l9 ]$ P4 {1 I
③、给单元格设置边框
% V$ d% p5 K5 T& D! n4 Omysheet.cells[2, 1].borderaround(xllinestyle.xlcontinuous, xlborderweight.xlthin, xlcolorindex.xlcolorindexautomatic, null);//画线
# x' `1 a$ e0 R3 w④、合并单元格! j  |' v4 Y$ O
//合并单元格前先要将要合并的单元格选择为range对象9 H# C6 z( A1 s# z
range r=range.get_range(a1:f3);
6 ]% |% I$ o# s' E; I) Z6 J2 O4 y. G//然后现设置合并单元格, m& N) W% b/ z' ?2 O
r.mergecells = true;* O+ ?/ y, a! Q* I2 S
⑤、设置单元格的字体、字号、背景色等属性) k$ g- w+ f/ m; d6 m
mysheet.cells[1, 1].font.name = 黑体;
, b: l6 `& [0 P/ Y) |2 R$ y/ D$ wmysheet.cells[1, 1].font.size = 20;
, o/ p8 W' C1 m' O  w% q3 wmysheet.rows[1:1].rowheight = 40;
' _+ _+ Q  A7 L0 C3 b. X3 [/ vmysheet.cells[1, 1].interior.color = color.fromargb(224, 224, 224);//设置颜色
9 Q5 T9 D: c/ K* r⑥、删除一行:6 f# E% v. J* L# `
//首先获取要删除的行的range$ |( K1 K% D5 E2 g% r4 ]! c: E
microsoft.office.interop.excel.range range = (microsoft.office.interop.excel.range)mysheet.rows[sendedrow[1], type.missing];4 h/ H. A5 I( Z: B4 J1 F
//注意删除行后删除后的行号被下面的行替换,如果逐行删除,请先从最大的行号往最小的行号删除
- b! w: R0 J' v2 x+ ]range.delete(microsoft.office.interop.excel.xldeleteshiftdirection.xlshiftup);
8 H' ^3 m) U5 G. C2 Z. o7 r' c; t/ m⑦、获取有数据的行数/ ?, ?0 S: _* l! Y- E, I- v% K
int rowsint = mysheet.usedrange.cells.rows.count;
$ T# x- F; t, ?# X( E六、excel文件的保存与退出
+ \4 v( \7 i6 }, r( m7 n6 a0 T: d: k1、excel的保存与退出
% }  b) |5 E% z9 Y4 E9 emybook.save();& }3 ]2 X; @/ @9 C
mybooks.close();
/ v6 H! m8 \" U" M1 xmyexcel.quit();' X* M8 U" b. _8 ?
2、excel指定文件保存
! z8 d& X) k+ Kmybook.close(true, filepath +_file_name, null);
3 z8 A4 S; E" M七、释放excle对象的资源与结束excel 进程" B2 k; _* Y0 [
关于这方面内容有好多网友都在讲多种方法,经过本人实践,以下方面才能真正做到结束excel的任务进程:
+ X' B5 @3 p$ T# b9 S5 ?9 u1、将所有以上对excel的操作放到一个方法中,
0 p. }- s7 N: v2 `" o3 g" L2、在操作excel后,即时将不使用对象一一释放并赋null值:
$ g+ k3 G- _; C# ssystem.runtime.interopservices.marshal.releasecomobject(mysheet);
" \5 G. [5 Z1 S: p: E3 jmysheet=null;- Y( Y& i! K0 o& u4 ~. j9 M3 m
system.runtime.interopservices.marshal.releasecomobject(mybook);
7 |$ X3 e1 Y4 `: X' C+ Hmybook=null;//http://www.111cn.net
, {% o% Q; t& |system.runtime.interopservices.marshal.releasecomobject(mybooks);
2 p$ Z' K2 r: ~- o3 `7 xmybooks=null;/ |3 {+ }$ g5 j' N0 p1 @+ i# z
system.runtime.interopservices.marshal.releasecomobject(myexcel);
$ U" D2 I: ]  Omyexcel=null;
$ ]7 p' {+ j8 x0 u+ x, s3、再新建一个方法,并以该方法中执行上面新建的操作excel方法,并在执行完操作excel方法的后面添加gc.collect():; I5 O/ J6 P! t0 a+ A  ]
//下面方法中outputexcel()方法是输出excel文件的对excel 操作的方法
. I4 a* G8 a( \# B4 \. O/ @. F; mprivate void killexcel()
& Y3 W- L: j. T! C{
- J6 ~2 S& D" d* J* e! P6 K. Noutputexcel();( \$ t' |' V' l, ?7 y
gc.collect();
$ o/ y4 e& Z7 Ugc.waitforpendingfinalizers();
- z% s/ _# a! c0 r}
+ @$ c  x/ y/ }. i2 J& ]3 i好多网友都在介绍使用gc.collect()释放excel占用的资源来结束excel进行,如果将“gc.collect();”与操作excel的业务写在一个程序块中,“gc”是永远不能结束excel进程的,在web应用程序中,这种现象是很可怕的事情。原因是gc不会清理本程序块中的垃圾内存的。$ t0 t2 q( X: R, J4 d
4、在业务事件中调用killexcel()方法:! |3 _% p1 W8 q& l3 k/ B
protected void linkbutton3_click(object sender, eventargs e)
; N, `4 n' p" F) A$ a6 r! ~! I{2 I7 C# T$ Q) _1 L  ?7 @
//导出excel- Q/ P& }7 ^, f
killexcel();2 j& \0 Y3 [  P+ Q& \1 D
}: o3 J' Z; g; W5 W) ^1 c
八、一些权限的基本设置:5 m; m0 r! c7 V  ]: R! j  X
使用以上方法在开发环境中调试程序没有一点问题,等发布到服务器上后,程序还是不能正常运行,需要进行如下的权限设置:: y  m& Z; f" a: l" |/ ~! n2 {
1、.net导出excel遇到的80070005错误的解决方法:5 Z2 v, A$ `2 I3 _8 @
检索 com 类工厂中 clsid 为 {00024500-0000-0000-c000-000000000046}的组件时失败,原因是出现以下错误: 80070005基本上.net导出excel文件,都需要如此配置一下,不配置有的时候没错,而配置后基本应该不会出错。; g' L6 W1 a1 l3 ^8 J( ^
具体配置方法如下:
3 ~$ a$ [% u/ U+ ^; Q; i1:在服务器上安装office的excel软件.
5 e* Y% {( ]3 Q* m9 A2:在开始->运行中输入dcomcnfg.exe启动组件服务& u* W$ }, B* ]
3:依次双击组件服务->计算机->我的电脑->dcom配置
) v5 X, T; B- X3 U9 X4:在dcom配置中找到microsoft excel 应用程序,在它上面点击右键,然后点击属性,弹出microsoft excel 应用程序属性对话框
& ^* R3 |0 U& t: a( b/ {+ [) F5:点击标识标签,选择交互式用户
" v* T2 y/ h& A# ]* T4 `& {6:点击安全标签,在启动和激活权限上点击自定义,然后点击对应的编辑按钮,在弹出的安全性对话框中填加一个network service用户(注意要选择本计算机名),并给它赋予本地启动和本地激活权限.
, e7 H% B( I& _) \' y7:依然是安全标签,在访问权限上点击自定义,然后点击编辑,在弹出的安全性对话框中也填加一个network service用户,然后赋予本地访问权限.
8 e( Q7 d( f5 i: B8.如果交互式用户设置后出现错误8000401a,可取消交互式用户,指定为administratr,可暂时解决此问题。进一步的解决方式还有待探讨。! S( U  b, E' Y8 S5 {
9.采用第8点的设置后,打开excel可能会出现“无法使用对象引用或链接”,并且不能进行单元格粘贴。原因不明,取消设置后即可消失。
- c6 V/ }8 \$ Z# E以上是本人在近期作开发时的一点心得,现整理成文档,供奋战在程序开发一线的朋友共享,愿看到的网友能名帮助解决“无法使用对象引用或链接”的问题。* N7 ?$ J8 \; c
  j4 m4 o+ Z- B
更多网页制作信息请查看: 网页制作

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