1、由dataset生成) X" i) d1 \: N% H8 N6 S
代码如下:
/ d" v7 |1 [5 h8 u. E8 ^# Z( o1 \public void createexcel(dataset ds,string typeid,string filename)+ k. v0 p# }; p: F$ x/ S$ w
{
' m+ _. o, C6 Y) d3 q- |4 V. f; H" ahttpresponse resp;
1 j' f4 I4 o2 S/ l! C- qresp = page.response;
0 `' Y) t+ e9 _* j2 z4 w* Sresp.contentencoding = system.text.encoding.getencoding(gb2312);
0 `* x7 D) j' o* K$ |resp.appendheader(content-disposition, attachment;filename= + filename);
2 b! U5 M7 z; ^7 w5 J8 Kstring colheaders= , ls_item=;
) u, k. e$ v, l! e7 vint i=0;6 p) z" @' v# {# ]5 X8 d/ Z
//定义表对象与行对像,同时用dataset对其值进行初始化. S' |6 @1 D# t$ @4 r9 A/ B. d. O
datatable dt=ds.tables[0];7 X9 B; r, c8 V3 I
datarow[] myrow=dt.select(); E/ r! b' G J+ P4 D: g6 {
// typeid==1时导出为excel格式文件;typeid==2时导出为xml格式文件
: y- X" p% t1 y: H w" X, Z" Rif(typeid==1)
2 L$ b" E7 }% i9 K% d6 j5 N; J{
: p( c/ d/ c# M6 A: l//取得数据表各列标题,各标题之间以t分割,最后一个列标题后加回车符( y+ u8 n6 Q( V" x# a" v7 z
for(i=0;i colheaders+=dt.columns.caption.tostring()+t;* j' S1 D( h$ B/ m; ~
colheaders +=dt.columns.caption.tostring() +n;; x& i2 e, ]- f ?8 u# L" }3 ~
//向http输出流中写入取得的数据信息0 g) I. ?2 q6 l2 |& ~: l7 F1 _9 _* Y
resp.write(colheaders);
2 p8 E& [3 x- v3 I$ n6 n//逐行处理数据5 [( N5 m) P9 r6 r
foreach(datarow row in myrow)
/ \0 b9 V- u% {{1 w7 k1 q5 U$ [ B9 [- t; n0 N' ^
//在当前行中,逐列获得数据,数据之间以t分割,结束时加回车符n
5 k0 |- m2 n7 U3 y5 q# c$ e- u4 [. pfor(i=0;i ls_item +=row.tostring() + t;% z/ L. K* Q H7 @3 U _8 V
ls_item += row.tostring() +n;9 k6 |* Z' r, I9 X4 }1 W
//当前行数据写入http输出流,并且置空ls_item以便下行数据+ H0 \$ J. \, i3 O
resp.write(ls_item);$ r# e6 U; q c+ C
ls_item=; ~8 H }/ m% Q! f5 ?2 X
}
- X% w( d5 O- F}
) t2 A- D$ i/ E+ Welse8 @3 g7 k) h9 I
{
$ T* o/ K% Q) p, r% }) E# \if(typeid==2). E' u9 s, p6 G: {5 x# `& g
{% N$ \& U3 } ]
//从dataset中直接导出xml数据并且写到http输出流中$ }% B' g* w0 @' I% J# h+ p( ?
resp.write(ds.getxml());
$ I0 N3 h8 K/ m+ k: F1 u}
6 \ I( g. R% w7 o' a5 @}
$ V4 y4 v. E- {; N$ c1 P+ F$ \//写缓冲区中的数据到http头文件中
' K6 t1 w1 t# S. k- ^* Zresp.end();
& s0 r5 |- F G& }6 b$ w}
$ S8 p: A. C; d: j2、由datagrid生成2 a7 k! E4 x1 g, k7 n! }- U
代码如下:
' U1 G9 G9 m) I( [' }( D1 ~public void toexcel(system.web.ui.control ctl)6 s6 z( C/ g" B- @" f( w: q
{7 t8 Q! \6 H2 u$ n+ C- |/ |$ Z
httpcontext.current.response.appendheader(content-disposition,attachment;filename=excel.xls);$ f; B- N) F3 P; V9 i0 _# C
httpcontext.current.response.charset =utf-8;0 M1 B, X1 o( v& B) @4 R; k6 r
httpcontext.current.response.contentencoding =system.text.encoding.default;
8 t0 E1 g/ c r/ {6 A3 Jhttpcontext.current.response.contenttype =application/ms-excel;//image/jpeg;text/html;image/gif;vnd.ms-excel/msword {* y/ S/ m9 F
ctl.page.enableviewstate =false;
2 ?9 f) i3 X* i9 f; ]; S* s* Ssystem.io.stringwriter tw = new system.io.stringwriter() ;
, B% _- t) k& e. T% dsystem.web.ui.htmltextwriter hw = new system.web.ui.htmltextwriter (tw);6 a3 ~; x8 o: r+ y% B" @& p2 u; }
ctl.rendercontrol(hw);
* h! M, [# q O- Nhttpcontext.current.response.write(tw.tostring());
6 o& D) A8 {9 ~1 |4 ?7 m6 ^httpcontext.current.response.end();
! d1 `; y6 p6 l O- A8 l+ E}
. M5 u# G' V w; R3 ~3 R用法:toexcel(datagrid1);! m; _& f- u. _6 X
3、这个用dataview$ B( N9 R! W3 T$ u
代码如下:
8 [! U: ~7 v# u; l; gpublic void outputexcel(dataview dv,string str)- d# K2 n% ]$ C" m; m! R; X, ]
{
- d& w* ^" h9 d4 ?7 N1 \. x//7 Y! |0 t/ G: Q/ L' S. w
// todo: 在此处添加构造函数逻辑% A) U+ w @+ c$ g9 [
//+ b! f2 `2 K f$ k' M0 M9 ]) j
//dv为要输出到excel的数据,str为标题名称
" q% a) o" ^% Ngc.collect();+ H9 l w$ D% f2 [
application excel;// = new application();
+ |7 L0 K$ e' i- [( ?# d! t9 `int rowindex=4;
. m: z. d- z9 D# d, @0 t$ R* y6 ^int colindex=1;+ V; }; E g& O8 t) o1 C1 v
_workbook xbk;8 G2 N$ g/ l2 o( f. q
_worksheet xst;
+ h9 d* b' m- iexcel= new applicationclass();5 }7 p+ Z' g# [' i
xbk = excel.workbooks.add(true);. }: m( L J/ s! r& y, U
xst = (_worksheet)xbk.activesheet;9 N4 i, o4 Y' B) l
//
8 y* F& d# C! r$ V3 y! w$ D% z//取得标题
2 g3 L+ k7 k! T3 R//9 c/ z* |$ R" i% m) h) U
foreach(datacolumn col in dv.table.columns), X' ]( Y2 M& p8 x
{' v! S. v. L/ r/ Q% }8 U
colindex++;
* o$ e5 [9 _2 V: ]excel.cells[4,colindex] = col.columnname;" U/ \$ R" M) W4 T8 @1 t# m
xst.get_range(excel.cells[4,colindex],excel.cells[4,colindex]).horizontalalignment = xlvalign.xlvaligncenter;//设置标题格式为居中对齐
8 M- Y/ O [- q% O) q' i6 b8 J}
% r, [" t& p P) X: I) | j: l//
$ H8 B. G* q8 F9 E+ u, }//取得表格中的数据
. h9 @3 o6 \' V! [' l4 Q5 @//
% \' t0 v8 n# E; a I/ H0 S; yforeach(datarowview row in dv)
9 ?; C+ D5 {/ }9 \, J9 g{
( I5 [8 i7 z( B% ^- ~rowindex ++;. U4 L% _2 U/ n# ]# q
colindex = 1;
2 ~$ G( {& `- l. Q5 N' fforeach(datacolumn col in dv.table.columns) r; e+ K9 f* k8 \+ C
{
$ ^1 }" ^8 o7 G1 {& T& Pcolindex ++;
4 J3 J7 B7 G5 mif(col.datatype == system.type.gettype(system.datetime))& }( c% B H7 ?
{
$ E0 v% R5 ]# ~! ?; h1 q# ?excel.cells[rowindex,colindex] = (convert.todatetime(row[col.columnname].tostring())).tostring(yyyy-mm-dd);
# q% H$ W ?" {xst.get_range(excel.cells[rowindex,colindex],excel.cells[rowindex,colindex]).horizontalalignment = xlvalign.xlvaligncenter;//设置日期型的字段格式为居中对齐
+ X" h9 b' \* V}
2 M1 u8 ~+ ^/ p0 Telse- M; F" `- s- g0 R- q
if(col.datatype == system.type.gettype(system.string)), j* [( V3 U$ V6 s8 z, y3 a
{
# }* {2 ` f# z/ p+ \. D4 n! wexcel.cells[rowindex,colindex] = '+row[col.columnname].tostring();
3 a( h: ]8 N" q* F' u- Dxst.get_range(excel.cells[rowindex,colindex],excel.cells[rowindex,colindex]).horizontalalignment = xlvalign.xlvaligncenter;//设置字符型的字段格式为居中对齐
$ B) }5 c1 K- C! x3 [, F0 F1 W}
0 P2 U8 Z+ a) O9 g* `) @+ oelse! u- ^6 N8 ^7 R* U9 Q {& o% p9 r
{) C, ^) K) K( l' g$ M* R
excel.cells[rowindex,colindex] = row[col.columnname].tostring();
- n( A# n: M6 B j. Q t}4 |7 Z% }+ D4 h7 Z: g/ }
}
) o( w. S% u/ L( z9 {( v- l}6 V1 l& ?' `! G2 e& R5 a' }
//7 W1 i/ {" G# `$ l$ D
//加载一个合计行+ d' |% F: p- I4 |) \
//
( p3 n, }9 X b% b1 M) L& Bint rowsum = rowindex + 1;
, q0 r: P; \3 qint colsum = 2;
7 @( O7 h/ O$ m. {, [# pexcel.cells[rowsum,2] = 合计;3 Z5 b4 b+ k; h' Z( D, ~# a$ d
xst.get_range(excel.cells[rowsum,2],excel.cells[rowsum,2]).horizontalalignment = xlhalign.xlhaligncenter;) p1 ]- r9 S; i- w* j
//
# k l% s) y1 {" _" P//设置选中的部分的颜色1 p5 O& m4 A- U
//
" O" c- J, q1 `. v+ k2 e/ Hxst.get_range(excel.cells[rowsum,colsum],excel.cells[rowsum,colindex]).select();( i& B4 U2 d3 D9 _' u7 C
xst.get_range(excel.cells[rowsum,colsum],excel.cells[rowsum,colindex]).interior.colorindex = 19;//设置为浅黄色,共计有56种
9 G+ m/ Q1 ?: x, X. m: I) u% l//
0 U* c6 e) q% C2 P+ I4 D//取得整个报表的标题9 S% Z- z% [; A8 u
//& n1 o' x8 g% K2 c! L0 g5 h
excel.cells[2,2] = str;1 L9 b3 [) x2 I5 t% Z9 s4 w( F4 N; G# l
//
+ I# M) Y. O7 W$ {//设置整个报表的标题格式1 Y$ ~, B* i; C
//
3 H- y5 d M" W3 Q) P3 cxst.get_range(excel.cells[2,2],excel.cells[2,2]).font.bold = true;- M+ G8 }, q. ^: E) @7 A
xst.get_range(excel.cells[2,2],excel.cells[2,2]).font.size = 22;% Q0 o: o6 Y- n5 F* m$ f/ P( L
//
# \, R) q: E: B' @' M* A7 Y4 V//设置报表表格为最适应宽度
& k. M5 H* _! e8 [& U! ~//( e2 g- c3 d9 o) v6 ?' v, |
xst.get_range(excel.cells[4,2],excel.cells[rowsum,colindex]).select();
9 ^' t7 v) Y. {0 O5 J2 ~xst.get_range(excel.cells[4,2],excel.cells[rowsum,colindex]).columns.autofit();
6 `. o; O7 l% `7 `' q. s//5 b9 I4 @5 f2 |( G% `
//设置整个报表的标题为跨列居中" G0 M+ b1 L" ~& K- w
//
) p( _2 i2 R3 B5 f8 c6 xxst.get_range(excel.cells[2,2],excel.cells[2,colindex]).select();
" q" u* L3 I- e- m f7 pxst.get_range(excel.cells[2,2],excel.cells[2,colindex]).horizontalalignment = xlhalign.xlhaligncenteracrossselection;; R! F0 h7 G/ g7 ]7 p2 g1 V. w
//
1 x4 S1 k: u* E; ^3 I, e//绘制边框
! S: }) U# [' F' o2 a0 C//
" J( j4 k0 V7 I8 E: Lxst.get_range(excel.cells[4,2],excel.cells[rowsum,colindex]).borders.linestyle = 1;# z4 E9 o7 m4 e4 n% q& R& k
xst.get_range(excel.cells[4,2],excel.cells[rowsum,2]).borders[xlbordersindex.xledgeleft].weight = xlborderweight.xlthick;//设置左边线加粗+ m- u9 _7 J" T \ {
xst.get_range(excel.cells[4,2],excel.cells[4,colindex]).borders[xlbordersindex.xledgetop].weight = xlborderweight.xlthick;//设置上边线加粗
( z3 Q4 s3 J) i+ q8 Kxst.get_range(excel.cells[4,colindex],excel.cells[rowsum,colindex]).borders[xlbordersindex.xledgeright].weight = xlborderweight.xlthick;//设置右边线加粗" R; w3 U, n, ?) v8 w) s6 m7 {& Y
xst.get_range(excel.cells[rowsum,2],excel.cells[rowsum,colindex]).borders[xlbordersindex.xledgebottom].weight = xlborderweight.xlthick;//设置下边线加粗7 P/ ^/ X3 e/ j
//) e+ ~/ m1 d, B$ H5 N/ h
//显示效果
, K9 O6 u6 Y3 c- t+ N, @/ w//0 g7 [5 n& g8 B& q% F2 o
excel.visible=true;
, V" U( W9 w5 ]( w& P, N//xst.export(server.mappath(.)++this.xlfile.text+.xls,
3 Z4 m& D3 M4 U* V; d8 asheetexportactionenum.ssexportactionnone,microsoft.office.interop.owc.sheetexportformat.ssexporthtml);, J( l+ o; r+ }) l
xbk.savecopyas(server.mappath(.)++this.xlfile.text+.xls);2 `7 Y# s' \3 }! b' l1 C- K
ds = null;0 ?- K9 e# J0 w* d* I
xbk.close(false, null,null);" b3 ~- J# T$ V) C# F
excel.quit();
' [/ H) a: O) E. \8 ] @% m( Zsystem.runtime.interopservices.marshal.releasecomobject(xbk);* j+ {3 q! H' X9 m; E3 }* d* V: j
system.runtime.interopservices.marshal.releasecomobject(excel);
) I) c6 Q; m& ?- J4 z5 \system.runtime.interopservices.marshal.releasecomobject(xst);- B+ C' O) e3 Y: w
xbk = null;
* p- D# x& F1 C8 ]excel = null;
: h# Y* H# |+ x: c$ {xst = null;
# W0 X0 A) u5 c7 r+ y' ~: Ogc.collect();; t+ z' @# ^2 u" B* w7 p
string path = server.mappath(this.xlfile.text+.xls);
6 k& \ e) Z8 osystem.io.fileinfo file = new system.io.fileinfo(path);
5 _ K4 P3 u. h M! b" u! y, q! Cresponse.clear();
0 V3 q3 L% f" p/ p* i' N% M& E) Sresponse.charset=gb2312;
1 s( F6 [* J7 I9 Qresponse.contentencoding=system.text.encoding.utf8;; n9 P+ n5 ?! T& q' I$ c k5 R
// 添加头信息,为文件下载/另存为对话框指定默认文件名) M0 v* f# T! s0 w- h* F
response.addheader(content-disposition, attachment; filename= + server.urlencode(file.name));
! R0 a( ~# ~8 g q// 添加头信息,指定文件大小,让浏览器能够显示下载进度
$ q8 V; \1 O0 ~! G4 @& A5 W! _response.addheader(content-length, file.length.tostring());1 q* e& `7 U2 p0 g o5 |1 i' [! f* V
// 指定返回的是一个不能被客户端读取的流,必须被下载2 s0 H. |% R! _7 V2 p4 O3 g
response.contenttype = application/ms-excel;
" T- z5 A, d G: o9 h// 把文件流发送到客户端3 z0 ^7 ?4 c; Q. l, h( v6 ^
response.writefile(file.fullname);1 X. T, A( Z8 u. \% e4 h
// 停止页面的执行, Z1 C! J( |! X; S1 \8 H+ g9 [
response.end();! e$ x$ B. Y, z) A1 R, Z8 W6 _
}
( s+ c8 h; V+ k9 w8 A% w# Y导入、导出excel中的一些问题汇总
/ D) G4 h) F9 M. B {8 ^一、在项目中的添加引用:) T8 _7 c" x9 t1 b
右击项目资源管理器的引用-->添加引用-->选择.net选项卡-->选择microsoft.office.interop.excel-->确定(如下图);8 L( G" M# L7 O
在选择时注意一下.net组件的版本号,图是的12.0.0.0是office2007的版本:4 E5 R& v1 O! P: j* N) [
二、在项目中使用microsoft.office.interop.excel:" o5 ~- m' L9 l% b" V) t
如果想使用microsoft.office.interop.excel,首先需要在项目中引用命名空间: \, I3 d( l. H( o7 j
using microsoft.office.interop.excel;
- h" i6 ?+ G- g+ b( k三、建立excel.application相关对象8 o0 Y: A2 ^& D. Y& M
//建立application对象* x/ J* \+ u' I' k$ B- ?
microsoft.office.interop.excel.application myexcel = new application();$ P0 O$ x1 o1 M8 b' A
//建立workbooks对象" k& H: R# w+ r
workbooks mybooks = myexcel.application.workbooks;
5 N5 G; U5 I# l8 x: g( \//建立一个system.reflection.missing的object对象" q" d7 T) g& F. y4 \0 D6 |
object omissing = system.reflection.missing.value;; i% g% I, L$ p8 Z
四、打开或新建excel的book文件 Q+ V/ b6 a) P
//打开excel文件,注意里的“exccelfilepath”为excel文件在服务器上的物理地址,包括文件名# V5 d# p3 O F- I' P! L" j4 J
workbook mybook = mybooks.open(exccelfilepath,omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing);
: _5 e# J! e" r) @//新建workseet对象,,此处为要操作的工作表 ,当前要操作的工作表的获取方法有两种:使用工作表的索引值或使用工作表的名称,名称默认为:“sheet1”/“sheet2”等. X/ t4 h/ {6 X
worksheet mysheet = (worksheet)mybook.worksheets[1];
" D/ y9 h/ a! }/ Y9 q9 s//如果是新建excel工作簿,需要 设置如下两行内容,以保证工作簿中有一个工作表,
, q- W, J v8 mworkbook workbook1 = excel1.workbooks.add(true);
7 @0 K7 J+ J4 n& h! l" F B' e/ Bworksheet mysheet= (worksheet)workbook1.worksheets[sheet1];
& A: B8 A, f! j: K, C. y; B2 q//设置excel对象是否显示界面,默认为false不显示界面
! N2 Z. B: Z/ p. g2 B' p. lmyexcel.visble=true;
# |( h$ {- O6 V3 \- T五、一些比较重要的针对excel的操作 H, H" T( B' V) j. f+ p0 r! Z
1、获取range对象/ ]9 V* Z6 M0 F& A
①、获取一个单元格的range对象:
% G- c. e6 F' x& C//选择第一行、第一列的单元的单元格为range对象* d: c5 \& Y7 W7 O. j- p! h2 O7 F
range r = (excel.range)mysheet.cells[1, 1];8 [' |: `& u* ~! u- r0 O
//选择多个连续的单元格为range对象
6 ?4 x3 @& ~5 b: O9 y: \& B0 \range r=(excel.range)range.get_range(a1:f3)
1 \. F/ N: k, Y9 O②、给单元格赋值或取出单元格的值:0 p: R& K# A/ Q d6 s* a
//已选择了range对象的赋值:( b, n" u1 ~, k2 ~! E' x
r.text=中国;
: S, c% c2 N4 C- m//未选择range对象的赋值:7 A1 R6 r! W: \. r- Z0 O- q
mysheet.cells[1,2].text=中国;
0 A9 m. `* t2 |' u. `9 d9 Q//已选择了range对象的取值:
. L1 E/ ~& C9 ^' astring strvalue= r.text;& a q" \9 Q w) w
//未选择range对象的取值:& p1 @( y. O9 w' E
string strvalue= mysheet.cells[1,2].text;
: l9 t4 x8 ^! M! p③、给单元格设置边框
# _2 N, y: H5 b" Vmysheet.cells[2, 1].borderaround(xllinestyle.xlcontinuous, xlborderweight.xlthin, xlcolorindex.xlcolorindexautomatic, null);//画线
- p2 q+ w" b% g1 ~$ }6 Q; w0 b, ` x④、合并单元格
2 ~. d8 _! t! M) b8 u//合并单元格前先要将要合并的单元格选择为range对象( J9 Q+ f' C: i$ t
range r=range.get_range(a1:f3);- J( U$ K) W5 I4 ?/ \9 [$ v1 N
//然后现设置合并单元格
( V' O# E( ]. x- I6 s8 [% E& Yr.mergecells = true;9 O2 M% f/ z1 c1 f8 k0 B2 s
⑤、设置单元格的字体、字号、背景色等属性: W5 Q6 G4 j4 I+ Q1 U- H
mysheet.cells[1, 1].font.name = 黑体;; T9 j+ J5 Q) B$ Q& @, p
mysheet.cells[1, 1].font.size = 20;) L! @* N2 H6 R- e- I8 W; h
mysheet.rows[1:1].rowheight = 40;
# R( r' j" L) H$ }$ K3 F$ C3 ?mysheet.cells[1, 1].interior.color = color.fromargb(224, 224, 224);//设置颜色$ [# V/ e4 d$ P" M! H7 f6 E7 G, z
⑥、删除一行:
4 f& q& t# E, Z! ]( ?( P//首先获取要删除的行的range* ]; R% B. Z% r" m- }
microsoft.office.interop.excel.range range = (microsoft.office.interop.excel.range)mysheet.rows[sendedrow[1], type.missing];& c2 X3 C8 \5 p' r
//注意删除行后删除后的行号被下面的行替换,如果逐行删除,请先从最大的行号往最小的行号删除
2 W5 e- E2 d9 n5 w' u1 frange.delete(microsoft.office.interop.excel.xldeleteshiftdirection.xlshiftup);: K6 q3 [; a3 Y
⑦、获取有数据的行数
) E, r5 M n; V2 e" |& m* F5 Qint rowsint = mysheet.usedrange.cells.rows.count;8 C( L1 S- q$ y9 u1 j1 u: P" q0 ?
六、excel文件的保存与退出0 Z5 N- x i7 o4 K
1、excel的保存与退出# j5 a- _7 l. _$ n) z7 X
mybook.save();
5 o, p% @. E7 k) e( H1 wmybooks.close();
( l% X) Y: _% r# P$ Xmyexcel.quit();. O0 u" q8 \4 ?3 C+ R4 s
2、excel指定文件保存- `5 F2 k" J k- T% |) G/ U6 S
mybook.close(true, filepath +_file_name, null);! m `9 j; [) ^! T# @
七、释放excle对象的资源与结束excel 进程3 d4 C, m# v4 z7 t, F
关于这方面内容有好多网友都在讲多种方法,经过本人实践,以下方面才能真正做到结束excel的任务进程:
$ j, F; B/ t6 Q8 n! d1、将所有以上对excel的操作放到一个方法中, J. c" c+ w: K% y# {
2、在操作excel后,即时将不使用对象一一释放并赋null值:
$ I; W/ q# B- {) Esystem.runtime.interopservices.marshal.releasecomobject(mysheet);
{; Y1 E. r8 Omysheet=null;2 w$ Y3 r" Q. C8 z) G
system.runtime.interopservices.marshal.releasecomobject(mybook);' n9 K, t6 v3 L' a7 ^
mybook=null;//http://www.111cn.net
. w5 B; t: b0 [$ x8 Gsystem.runtime.interopservices.marshal.releasecomobject(mybooks);
! L* ~) j$ E; L% l Vmybooks=null;
5 N# E0 ?, g/ n0 F' xsystem.runtime.interopservices.marshal.releasecomobject(myexcel);
5 A- ~2 A. ?7 C& t% Jmyexcel=null;
/ q$ r( B- `/ j7 m; j3 X; k3、再新建一个方法,并以该方法中执行上面新建的操作excel方法,并在执行完操作excel方法的后面添加gc.collect():2 B" I, D% Z3 L5 f$ L9 x5 W9 }
//下面方法中outputexcel()方法是输出excel文件的对excel 操作的方法$ Z" {5 l4 y) Z- u% F( G
private void killexcel(). s: L- ~6 `( o0 }- g$ T
{
0 G2 O$ U$ G- Q, {outputexcel();$ ]) e* y9 _# s3 E
gc.collect();7 O, A3 G+ y( m+ h
gc.waitforpendingfinalizers();* Z; Q1 E( r4 ~& c: {& j+ b
}; X+ k8 }9 v" S2 C4 T/ q
好多网友都在介绍使用gc.collect()释放excel占用的资源来结束excel进行,如果将“gc.collect();”与操作excel的业务写在一个程序块中,“gc”是永远不能结束excel进程的,在web应用程序中,这种现象是很可怕的事情。原因是gc不会清理本程序块中的垃圾内存的。
! o1 v9 r) l% z2 A5 e( P* a4 R4、在业务事件中调用killexcel()方法:. @0 l! W# h" P: z( K
protected void linkbutton3_click(object sender, eventargs e)
2 R) I0 N6 w7 W1 L8 j{9 q( K: ~/ n8 V x* ]5 ?% m
//导出excel7 _/ E5 j& N* s1 v* @+ j8 r' {
killexcel();
3 G( \' \+ [- |9 o}
- m u |4 T. w+ U+ P) I# I, z% q! x八、一些权限的基本设置:
/ n1 S s2 n1 b4 E$ Y' W使用以上方法在开发环境中调试程序没有一点问题,等发布到服务器上后,程序还是不能正常运行,需要进行如下的权限设置: K" Z N& O6 j+ ~" C5 W) |2 U
1、.net导出excel遇到的80070005错误的解决方法:
8 Y+ s# h' G+ |0 w3 E: d) l5 Y0 I检索 com 类工厂中 clsid 为 {00024500-0000-0000-c000-000000000046}的组件时失败,原因是出现以下错误: 80070005基本上.net导出excel文件,都需要如此配置一下,不配置有的时候没错,而配置后基本应该不会出错。* f; P) n% M! I; y3 c( W0 ~
具体配置方法如下: u1 K ]7 r/ p
1:在服务器上安装office的excel软件." e) U0 i5 k3 F. _2 o
2:在开始->运行中输入dcomcnfg.exe启动组件服务
! l7 k% a5 {. q+ b" `5 R: q3:依次双击组件服务->计算机->我的电脑->dcom配置
. H% K/ M; b* I& I4:在dcom配置中找到microsoft excel 应用程序,在它上面点击右键,然后点击属性,弹出microsoft excel 应用程序属性对话框+ x ?- E1 z5 o2 C5 d: w0 d4 c
5:点击标识标签,选择交互式用户5 D4 ^- h0 _; c/ }
6:点击安全标签,在启动和激活权限上点击自定义,然后点击对应的编辑按钮,在弹出的安全性对话框中填加一个network service用户(注意要选择本计算机名),并给它赋予本地启动和本地激活权限.0 H$ o1 X% p( n; v- [( Q
7:依然是安全标签,在访问权限上点击自定义,然后点击编辑,在弹出的安全性对话框中也填加一个network service用户,然后赋予本地访问权限.
/ e. S$ z4 O: ]. y, K8.如果交互式用户设置后出现错误8000401a,可取消交互式用户,指定为administratr,可暂时解决此问题。进一步的解决方式还有待探讨。
6 O2 e& N: L) s1 B" C9.采用第8点的设置后,打开excel可能会出现“无法使用对象引用或链接”,并且不能进行单元格粘贴。原因不明,取消设置后即可消失。
- c' i% V4 a# X以上是本人在近期作开发时的一点心得,现整理成文档,供奋战在程序开发一线的朋友共享,愿看到的网友能名帮助解决“无法使用对象引用或链接”的问题。% k3 k$ l7 N; h& `1 y
4 c5 ^! n+ _' t, @
更多网页制作信息请查看: 网页制作 |
|