1、由dataset生成
, h2 {* w; A4 B: M* x代码如下:3 J Z ~3 L6 h3 [# m/ O2 H
public void createexcel(dataset ds,string typeid,string filename)+ o2 C j1 \. Q3 L5 ~$ e* ?4 Y
{
/ {: Q0 p7 a; c( q( Qhttpresponse resp;
y9 K) X5 _. |* Z( q' F0 Dresp = page.response;. e, E( C# f' K* W* N# f2 Q
resp.contentencoding = system.text.encoding.getencoding(gb2312);$ J* u- b. P& d+ M
resp.appendheader(content-disposition, attachment;filename= + filename);
7 {6 P% q { c4 P- q! Rstring colheaders= , ls_item=;* d' I0 C5 A" @/ L# Q6 _0 @! u' X
int i=0;* u1 E3 P- `- k8 o
//定义表对象与行对像,同时用dataset对其值进行初始化 N6 W4 n- ^3 P( `$ K' ~
datatable dt=ds.tables[0]; ?! V9 P. q' l1 K/ r. N! ^) Y L
datarow[] myrow=dt.select();5 b4 l E2 r$ ] v1 [
// typeid==1时导出为excel格式文件;typeid==2时导出为xml格式文件
- d5 n& O& y/ X; v( B! H+ uif(typeid==1)# e, I3 b9 G% C6 ? Y. |
{0 t& [! {) f8 O( p9 n
//取得数据表各列标题,各标题之间以t分割,最后一个列标题后加回车符4 `4 {2 l" v( y6 `. ]
for(i=0;i colheaders+=dt.columns.caption.tostring()+t;
; j8 t1 V7 Y% Y R+ V! g) c! Rcolheaders +=dt.columns.caption.tostring() +n;
; R& ]4 J: F8 `8 E2 f% G//向http输出流中写入取得的数据信息
$ D0 K( z' |' _) h! @% U3 Gresp.write(colheaders);
7 v; M C: L/ s2 Z$ {1 ?//逐行处理数据
( K1 q) Y$ G2 J% ` ]& mforeach(datarow row in myrow)
0 i. ], F9 b, E5 ^' n{5 \& t6 x, t# V) A8 n
//在当前行中,逐列获得数据,数据之间以t分割,结束时加回车符n% k/ w0 J$ G3 H9 p& N2 u& Z
for(i=0;i ls_item +=row.tostring() + t;
& ?* W# M" W+ D4 O+ N* z) ols_item += row.tostring() +n;
. l% s1 k# X$ N- b//当前行数据写入http输出流,并且置空ls_item以便下行数据* j8 F2 \4 {$ { N s' c9 H4 O
resp.write(ls_item);
* I( Y$ A' p+ b% F$ p: Cls_item=;' w& _( Y7 L3 }! y9 Z* Q2 v
}
* l1 p+ U+ Q: \} s' g4 V2 J$ i% L* C
else
g( Y O( f R- M0 c' R( l{) R1 d+ M" V) m! `
if(typeid==2)7 U' Y9 z- L9 O9 }4 P
{
; W8 f/ C, M/ q+ O4 |//从dataset中直接导出xml数据并且写到http输出流中
; t% v! b' {6 d- ]resp.write(ds.getxml());
. j6 A ~6 i% W}' E; y! ^8 D; F6 w" p
}
' b! g3 Z% R6 L; k, e1 I8 b//写缓冲区中的数据到http头文件中4 l% g, g. ^- H- u) a
resp.end();4 y. r& j; z" ]6 \7 v7 u
}$ {7 N0 n- [2 |+ v9 D0 q
2、由datagrid生成
, P0 V, t) F4 ]) ^% G. E代码如下:
. ?6 @ K3 v+ v- v9 `public void toexcel(system.web.ui.control ctl)' f; ^3 K5 G/ V8 H, i
{
2 A% m$ `. @( w Rhttpcontext.current.response.appendheader(content-disposition,attachment;filename=excel.xls);
/ o) D8 X1 O; s6 uhttpcontext.current.response.charset =utf-8;; p6 j2 J1 D/ M2 b& Y
httpcontext.current.response.contentencoding =system.text.encoding.default;7 t& @8 \/ `$ B
httpcontext.current.response.contenttype =application/ms-excel;//image/jpeg;text/html;image/gif;vnd.ms-excel/msword
" M4 T* G. H- t- H D/ v: @" actl.page.enableviewstate =false;
6 c$ h( m& S- t" Esystem.io.stringwriter tw = new system.io.stringwriter() ;
, g; [, I8 B' ?& O& d8 g5 Vsystem.web.ui.htmltextwriter hw = new system.web.ui.htmltextwriter (tw);
$ T/ a0 w2 \ actl.rendercontrol(hw);
+ @* l' N: K6 X: `0 E0 chttpcontext.current.response.write(tw.tostring());
* y( |) s4 U9 ~httpcontext.current.response.end();
# e6 _+ b$ H+ l) O" ` N}! h$ i5 g: Q% e: b- ~2 |. b: y$ e
用法:toexcel(datagrid1);
* {8 ]( \7 Z7 i e5 ^3、这个用dataview
2 i; G0 O* g& z% e! o5 a2 x. V* c1 R代码如下:
) o4 A1 @9 y Y; U+ opublic void outputexcel(dataview dv,string str)
' h% } a" d( _# S{) t R% ] X- m O" E$ b0 P3 _
//
0 g/ `$ P& M* c) a3 [2 Z' u// todo: 在此处添加构造函数逻辑
u0 ?# A+ V5 e3 g9 _//
2 s7 Z. I- K3 r//dv为要输出到excel的数据,str为标题名称( m3 _; T/ X6 ]
gc.collect();# j; U; m2 `, R" n% M
application excel;// = new application();* m# S0 O2 A; G B# ^
int rowindex=4;9 l$ A8 E! S H" c! N4 p
int colindex=1;- g9 s3 L/ m* i. x* L
_workbook xbk;% A ^. c6 ~: n, A1 b
_worksheet xst;/ Y$ Q' A3 t8 q/ a3 r; d
excel= new applicationclass();
+ f/ ]/ v! l, d6 p' xxbk = excel.workbooks.add(true);3 Z: K" J3 y6 q/ {. p
xst = (_worksheet)xbk.activesheet;( S2 Y, X9 J; w* O! ~& Y
//
3 c/ B* Z0 ?1 ]3 g//取得标题
5 M# H# K8 L$ T//& x, Y5 | t3 n a; Q$ H8 `( w. ]
foreach(datacolumn col in dv.table.columns)
/ X: Z) I: U3 Q6 G1 @/ _{ m* r, V3 F% B8 r- P
colindex++;
. a6 M3 z& d' S$ Bexcel.cells[4,colindex] = col.columnname;
9 S* A! g. f3 x' j+ gxst.get_range(excel.cells[4,colindex],excel.cells[4,colindex]).horizontalalignment = xlvalign.xlvaligncenter;//设置标题格式为居中对齐% M4 ?* E/ y$ s
}
7 _% F. H w2 _& p, {2 b" s7 a//! e9 C4 | q* p" Q$ N5 F
//取得表格中的数据
2 T, n9 Z4 a9 H8 N1 E. k1 W//
\0 P3 O- D" {8 E; v% iforeach(datarowview row in dv)
V, R6 b, E6 W: a' w' W{+ v0 T6 W5 U8 N# U5 E
rowindex ++;( I/ y0 a% I, l* ~" I* b
colindex = 1;/ b: p) Y- [. n" C+ y7 N
foreach(datacolumn col in dv.table.columns)# |. p9 \ B$ s$ t1 X4 X% v& `+ ^, U
{
0 h& s+ B; e9 ^colindex ++;" T) D$ F- o3 s9 f' g
if(col.datatype == system.type.gettype(system.datetime))
8 r9 s" G7 b0 D3 @! Q' \, b: J{
0 y8 K2 J+ R8 R3 ?+ F: M) O! n9 N0 Aexcel.cells[rowindex,colindex] = (convert.todatetime(row[col.columnname].tostring())).tostring(yyyy-mm-dd);4 Q- A W4 |7 F% }9 K
xst.get_range(excel.cells[rowindex,colindex],excel.cells[rowindex,colindex]).horizontalalignment = xlvalign.xlvaligncenter;//设置日期型的字段格式为居中对齐! l* S7 f" Y! w& M
} ?- ]) B: x5 o! G; L0 s1 w
else. ^3 K( R& ~& F: `; i
if(col.datatype == system.type.gettype(system.string))
" C+ Q( { h3 t/ Q{
' c+ r8 `: E. oexcel.cells[rowindex,colindex] = '+row[col.columnname].tostring();
! B8 g! n( z- B# k, A- Jxst.get_range(excel.cells[rowindex,colindex],excel.cells[rowindex,colindex]).horizontalalignment = xlvalign.xlvaligncenter;//设置字符型的字段格式为居中对齐8 @/ g& ~* b4 h2 \
}
, }5 @% N0 x: W L# J# X8 {# m- Gelse
+ H0 L7 q" b5 W- ^1 R& h{! u R, z! H$ }6 v% C2 N
excel.cells[rowindex,colindex] = row[col.columnname].tostring();3 Q4 F) i6 G+ F* o+ N
}/ S& S( g9 j% v' z. O6 V
} T! D' `) ^% c. i' q
}$ x8 r" N8 j- _0 P# b
//
# u; I& D6 b+ S9 r7 e0 E" M//加载一个合计行
. p" m% x" H( p0 D! r2 }# }" k//
. ~8 J+ S2 | g5 Eint rowsum = rowindex + 1;, p4 R7 w; g7 G6 R9 d
int colsum = 2;
7 g; s O; s, D O aexcel.cells[rowsum,2] = 合计;
9 ?5 _1 P9 o2 k# Q) Y' Z. g/ Nxst.get_range(excel.cells[rowsum,2],excel.cells[rowsum,2]).horizontalalignment = xlhalign.xlhaligncenter;
* W# H4 B* T$ o//9 v( e( K# F7 G& q; N6 ~
//设置选中的部分的颜色/ J) d4 y) s, \7 K3 o8 r
//
+ u6 g! }! Z( z2 H9 Qxst.get_range(excel.cells[rowsum,colsum],excel.cells[rowsum,colindex]).select();7 K6 g& i$ ~* [! j4 a
xst.get_range(excel.cells[rowsum,colsum],excel.cells[rowsum,colindex]).interior.colorindex = 19;//设置为浅黄色,共计有56种
+ h1 K0 W4 g% s//
1 r/ n3 ^) Z8 O+ J//取得整个报表的标题
6 A% ^, G* k. d/ R$ d//
5 Q) i! }8 f/ o0 T' Sexcel.cells[2,2] = str; {" @% t7 N9 Q
//
. z& {$ [$ a( k+ `" E/ W d' ?4 j//设置整个报表的标题格式# a# O* {* W( d$ x/ C( f& n
//
! H% l7 g& Y8 qxst.get_range(excel.cells[2,2],excel.cells[2,2]).font.bold = true;& h+ h9 T, j# J! a
xst.get_range(excel.cells[2,2],excel.cells[2,2]).font.size = 22; K l! m( z. _( O- w& t
//
5 T' M& _: e! D//设置报表表格为最适应宽度' E1 C# Q( m( P
//
, ]8 F/ G8 d9 b2 s ~xst.get_range(excel.cells[4,2],excel.cells[rowsum,colindex]).select();
z9 e8 E! F, l5 U- u# _xst.get_range(excel.cells[4,2],excel.cells[rowsum,colindex]).columns.autofit();
1 i0 K6 D) ^6 E$ J2 X//
. p! B1 I' P1 o) K; c//设置整个报表的标题为跨列居中
- W8 A+ \& J$ a/ s0 s//! _8 \* o/ b( I/ I, f
xst.get_range(excel.cells[2,2],excel.cells[2,colindex]).select();
5 Y& B0 ~) D! f6 K$ ^' Jxst.get_range(excel.cells[2,2],excel.cells[2,colindex]).horizontalalignment = xlhalign.xlhaligncenteracrossselection;
" {* n. y( v# z- F Z, X//
8 J) @! r0 _' E o- k/ Q! I7 c# r//绘制边框
, q% W" ^: @3 @% l! ?//
8 M6 o, w4 S1 O+ r* ^5 ^( {xst.get_range(excel.cells[4,2],excel.cells[rowsum,colindex]).borders.linestyle = 1;
0 p" `& [5 e3 A9 ~xst.get_range(excel.cells[4,2],excel.cells[rowsum,2]).borders[xlbordersindex.xledgeleft].weight = xlborderweight.xlthick;//设置左边线加粗 z) W# ^# ^ K# ^
xst.get_range(excel.cells[4,2],excel.cells[4,colindex]).borders[xlbordersindex.xledgetop].weight = xlborderweight.xlthick;//设置上边线加粗9 f. V/ [5 K5 m/ I3 M5 P
xst.get_range(excel.cells[4,colindex],excel.cells[rowsum,colindex]).borders[xlbordersindex.xledgeright].weight = xlborderweight.xlthick;//设置右边线加粗( p( Z* ]- d! y+ ]: A- E+ n
xst.get_range(excel.cells[rowsum,2],excel.cells[rowsum,colindex]).borders[xlbordersindex.xledgebottom].weight = xlborderweight.xlthick;//设置下边线加粗
4 l+ G* [- e# w) W( M7 N! _//
6 k% ~, e ]0 } M6 u9 e//显示效果
1 t6 d$ w/ T* d( ^//2 s$ y, l# } T& `7 P" ?% Y
excel.visible=true;
& P W7 k: n$ a//xst.export(server.mappath(.)++this.xlfile.text+.xls,
' f, f2 ], y2 q: Z% e3 [sheetexportactionenum.ssexportactionnone,microsoft.office.interop.owc.sheetexportformat.ssexporthtml);. A4 E# n D# f
xbk.savecopyas(server.mappath(.)++this.xlfile.text+.xls);
7 h+ I8 t1 j& H4 U4 F& J8 ^8 Rds = null;8 o! Z: Q7 `5 R% H
xbk.close(false, null,null);
) D6 x) ]5 K/ X: o/ Lexcel.quit();
# |/ z& I. C7 R2 Z, k& s. u4 H: Wsystem.runtime.interopservices.marshal.releasecomobject(xbk);
/ Y: ?0 B2 i& } b/ R& \2 G8 G _system.runtime.interopservices.marshal.releasecomobject(excel);
$ U- m/ I* X+ m, A7 Asystem.runtime.interopservices.marshal.releasecomobject(xst);6 y; v' A1 B2 H8 I4 `0 U ?
xbk = null;
" J; @0 W4 W- r5 d& {; `excel = null;3 Q( O; t& r/ ]2 E: `5 l [& m% G
xst = null;
% G4 G! S$ j$ u5 S- egc.collect();
+ {) e7 d) M, g& jstring path = server.mappath(this.xlfile.text+.xls);4 M" L3 h# A7 z0 d
system.io.fileinfo file = new system.io.fileinfo(path);1 I: \! B& h+ C# n9 @7 Q
response.clear();, q; z) Q- q9 b5 i5 B
response.charset=gb2312;5 j+ d: M j5 P7 |! t+ @
response.contentencoding=system.text.encoding.utf8;: g9 n# v: b2 Q5 P# g, g
// 添加头信息,为文件下载/另存为对话框指定默认文件名
W7 w/ G! l. H* Qresponse.addheader(content-disposition, attachment; filename= + server.urlencode(file.name));4 _2 p5 i9 r: Q8 ^- O% ~. J
// 添加头信息,指定文件大小,让浏览器能够显示下载进度# X" [3 j' R; K; u2 B, Q% @: U( z
response.addheader(content-length, file.length.tostring());
3 ? y3 Q/ R+ v8 h q8 c {7 @$ D. d& a// 指定返回的是一个不能被客户端读取的流,必须被下载/ @" `/ Y/ Y- o! X: q3 i0 R
response.contenttype = application/ms-excel;
1 d9 ~7 L0 U2 E// 把文件流发送到客户端7 v% C5 n+ S. j j1 _' q" T9 B
response.writefile(file.fullname);: c! C* A- d1 S% y) f
// 停止页面的执行 y T+ _$ C$ p! f1 Q! F3 r
response.end();
/ x/ G; i% |5 g* j! u. A3 g}+ n. g4 E. O2 h1 u% x
导入、导出excel中的一些问题汇总
6 E( ]5 d7 e6 e: i; a- Z4 h一、在项目中的添加引用:
9 t# \3 ~: l" f; D1 Y, B, l右击项目资源管理器的引用-->添加引用-->选择.net选项卡-->选择microsoft.office.interop.excel-->确定(如下图);$ J. N' c' K, o5 \2 A/ R" M
在选择时注意一下.net组件的版本号,图是的12.0.0.0是office2007的版本:
+ j) T( U# W5 Y. x* D7 r二、在项目中使用microsoft.office.interop.excel:
0 c7 C9 s- Z5 R! S( u& @6 Y, y如果想使用microsoft.office.interop.excel,首先需要在项目中引用命名空间:
: y& G; z& }7 G0 [2 b- ausing microsoft.office.interop.excel;
l8 h" G2 C0 |6 G0 q三、建立excel.application相关对象+ j" u# j9 T. @" I! H6 u6 {
//建立application对象
1 V5 H- u" \3 D$ ~9 h% Umicrosoft.office.interop.excel.application myexcel = new application();3 d* _! m" P5 G6 e* ?" L
//建立workbooks对象
, |. h1 k+ h$ P' _ N! L# eworkbooks mybooks = myexcel.application.workbooks;" g( ?6 S: l! o1 Z. b" x
//建立一个system.reflection.missing的object对象
; K1 O |8 } t1 o- G2 p: [object omissing = system.reflection.missing.value;
& { c M$ G0 I, c7 ~8 e四、打开或新建excel的book文件: T# j3 j6 D/ x' k' M8 U4 w3 e* ]
//打开excel文件,注意里的“exccelfilepath”为excel文件在服务器上的物理地址,包括文件名+ X8 S% c* f; \+ j6 `
workbook mybook = mybooks.open(exccelfilepath,omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing, omissing);" ?' U" \. v3 l. o7 @) }
//新建workseet对象,,此处为要操作的工作表 ,当前要操作的工作表的获取方法有两种:使用工作表的索引值或使用工作表的名称,名称默认为:“sheet1”/“sheet2”等
. U* T9 k2 U6 j9 L7 s( Uworksheet mysheet = (worksheet)mybook.worksheets[1];7 s+ `1 k- }0 [- Z b
//如果是新建excel工作簿,需要 设置如下两行内容,以保证工作簿中有一个工作表,+ e8 k3 H- j1 b/ E4 I+ Y3 \6 i% C
workbook workbook1 = excel1.workbooks.add(true);
( v& n$ s I% @: R9 ?2 mworksheet mysheet= (worksheet)workbook1.worksheets[sheet1];4 O5 v# N, l6 O
//设置excel对象是否显示界面,默认为false不显示界面0 ?) X1 s. ?, V+ |+ M
myexcel.visble=true;2 z) p9 t1 A5 m8 {+ U% `# |# j
五、一些比较重要的针对excel的操作
' R* e+ @4 e1 P# J1、获取range对象: b+ l( U9 {( L, G
①、获取一个单元格的range对象:7 H6 G, \' J( Z0 b
//选择第一行、第一列的单元的单元格为range对象
2 V% S* r9 n) U5 nrange r = (excel.range)mysheet.cells[1, 1];
7 {! h% R9 _8 W. y. t& l//选择多个连续的单元格为range对象) J$ v$ c( i$ N7 P: _7 A4 Y
range r=(excel.range)range.get_range(a1:f3)$ @( m5 A' {* O
②、给单元格赋值或取出单元格的值:
/ b' Y! a) Q! a+ P) G- Y//已选择了range对象的赋值:
; C: k5 B# \: [9 k# r2 @r.text=中国;
7 T+ V3 S4 }! [, q R//未选择range对象的赋值:) d- h: H0 E& s( p
mysheet.cells[1,2].text=中国;
2 @5 K5 i# B ?//已选择了range对象的取值:+ G i9 N1 {9 h$ ^; D1 a
string strvalue= r.text;* T* N# k1 {; o9 w% f2 w- t5 F5 O0 w
//未选择range对象的取值:$ F0 Q4 |) Y# J/ x# O3 V
string strvalue= mysheet.cells[1,2].text;7 ^ N- {2 V y, ~# h% |+ k% I
③、给单元格设置边框8 h, |; F2 Z5 g% e, S
mysheet.cells[2, 1].borderaround(xllinestyle.xlcontinuous, xlborderweight.xlthin, xlcolorindex.xlcolorindexautomatic, null);//画线
% h3 A( P8 D, h2 A$ Q# \④、合并单元格+ b6 G$ q n* R0 O8 ]3 U2 |
//合并单元格前先要将要合并的单元格选择为range对象
1 K- Q3 m3 ?# @6 P. |range r=range.get_range(a1:f3);
9 m7 O1 p H7 V( R! Q//然后现设置合并单元格
8 K( n3 `5 T+ c- y* a, Z, o ir.mergecells = true;; l# S0 H3 b. f( G
⑤、设置单元格的字体、字号、背景色等属性
# O: F$ Q! C" D3 o; l6 `( Amysheet.cells[1, 1].font.name = 黑体;
/ c2 G1 K( c6 s3 u0 Z0 Y( Qmysheet.cells[1, 1].font.size = 20;+ R$ Q8 A# a3 p! z5 j) b0 u7 w
mysheet.rows[1:1].rowheight = 40;
+ W; K6 ^' U1 G2 ~- ~" n( }mysheet.cells[1, 1].interior.color = color.fromargb(224, 224, 224);//设置颜色" A/ W% [5 I R6 h( y3 o
⑥、删除一行:( T k) J, o1 T" x6 h
//首先获取要删除的行的range" E2 \- D7 {/ }9 E+ T
microsoft.office.interop.excel.range range = (microsoft.office.interop.excel.range)mysheet.rows[sendedrow[1], type.missing];: ~, X% G" }7 y) B8 f5 m: v9 {4 F
//注意删除行后删除后的行号被下面的行替换,如果逐行删除,请先从最大的行号往最小的行号删除
" |( g5 I3 W1 [range.delete(microsoft.office.interop.excel.xldeleteshiftdirection.xlshiftup);" h9 Z- C& }/ Y: e x1 L; T
⑦、获取有数据的行数
" e4 ~/ d# ~! X6 e6 y" G% U, u) gint rowsint = mysheet.usedrange.cells.rows.count;
- i" ~/ b: k4 b: V8 \六、excel文件的保存与退出' g3 Y) @- _4 b$ W7 X. K" _" p
1、excel的保存与退出
* {8 G) Z7 Y5 y3 Bmybook.save();
# V- k0 g) N& S$ w) h" Ymybooks.close();& f* \+ [: @2 m6 P
myexcel.quit();+ Z+ r. H) o9 {9 s) p, x
2、excel指定文件保存6 M9 n% N( S t5 e" K
mybook.close(true, filepath +_file_name, null); Y7 W, G" V' H) [# T
七、释放excle对象的资源与结束excel 进程% U2 G* T- f3 O6 |/ p
关于这方面内容有好多网友都在讲多种方法,经过本人实践,以下方面才能真正做到结束excel的任务进程:
+ Z9 ^& j2 a L& P1 V1、将所有以上对excel的操作放到一个方法中,
! g; z$ M) E4 X( |% g. Y- d2、在操作excel后,即时将不使用对象一一释放并赋null值:
& [, `1 @: C8 U4 V0 hsystem.runtime.interopservices.marshal.releasecomobject(mysheet);* V/ R- p/ E% Z8 ^3 v5 T# E6 m
mysheet=null;
8 B% d" `# z8 n* N6 x+ Ysystem.runtime.interopservices.marshal.releasecomobject(mybook);
/ d# ]( S% D5 e2 u3 Hmybook=null;//http://www.111cn.net% m9 q- B2 t6 R
system.runtime.interopservices.marshal.releasecomobject(mybooks);( Q6 U8 x( R4 q, _- E- ~1 n
mybooks=null;/ f9 A7 ^- X6 \ W
system.runtime.interopservices.marshal.releasecomobject(myexcel);
) @% C6 Q& u2 g/ m2 D, O0 c3 imyexcel=null;
! v/ `) C8 B9 [$ q$ p' D* c3、再新建一个方法,并以该方法中执行上面新建的操作excel方法,并在执行完操作excel方法的后面添加gc.collect():" q( w% e$ h0 M; o* e% W
//下面方法中outputexcel()方法是输出excel文件的对excel 操作的方法
8 V1 x& m0 p0 u, l' V; k5 Bprivate void killexcel()
( f" ^2 }4 C' C6 h{& v' |/ h, o( k
outputexcel();: A8 m0 m k3 e2 {
gc.collect();1 w: [, I- v6 }
gc.waitforpendingfinalizers();
- e ~3 `. {+ t2 H: `}4 a/ ?7 f2 n( d9 \
好多网友都在介绍使用gc.collect()释放excel占用的资源来结束excel进行,如果将“gc.collect();”与操作excel的业务写在一个程序块中,“gc”是永远不能结束excel进程的,在web应用程序中,这种现象是很可怕的事情。原因是gc不会清理本程序块中的垃圾内存的。. r4 }) h3 l3 p5 c" O4 h
4、在业务事件中调用killexcel()方法:
$ o4 h0 K, n, |( A* Cprotected void linkbutton3_click(object sender, eventargs e)8 Q4 D" @' k7 a" P
{2 N- }1 g2 ]. y0 Z) B! N4 f0 F. {9 \$ ]
//导出excel
! b! V2 U" d qkillexcel(); E* c8 u4 ~( R0 `1 m: s/ g4 J
}
4 }( L" \5 ~' h8 D' Y1 ]八、一些权限的基本设置:8 z8 V& a0 S" |
使用以上方法在开发环境中调试程序没有一点问题,等发布到服务器上后,程序还是不能正常运行,需要进行如下的权限设置:9 O) m. L* i" B& O
1、.net导出excel遇到的80070005错误的解决方法:( a6 Y6 z0 a/ D2 N3 G. y
检索 com 类工厂中 clsid 为 {00024500-0000-0000-c000-000000000046}的组件时失败,原因是出现以下错误: 80070005基本上.net导出excel文件,都需要如此配置一下,不配置有的时候没错,而配置后基本应该不会出错。/ {- m' Z1 T! q# i
具体配置方法如下:
7 x/ J- s, D8 l% ~$ l1 {/ n4 R1:在服务器上安装office的excel软件.
" f5 D! q [6 T9 e) M5 K- U2:在开始->运行中输入dcomcnfg.exe启动组件服务7 P1 p- J4 F. J
3:依次双击组件服务->计算机->我的电脑->dcom配置. u4 _2 {4 O# Y) @
4:在dcom配置中找到microsoft excel 应用程序,在它上面点击右键,然后点击属性,弹出microsoft excel 应用程序属性对话框6 s7 A5 X) G' h3 B
5:点击标识标签,选择交互式用户
( H. S1 O4 Q5 y! r# X+ l6 y: O$ |6:点击安全标签,在启动和激活权限上点击自定义,然后点击对应的编辑按钮,在弹出的安全性对话框中填加一个network service用户(注意要选择本计算机名),并给它赋予本地启动和本地激活权限.
4 d+ g' T- M6 N+ r) @. S7:依然是安全标签,在访问权限上点击自定义,然后点击编辑,在弹出的安全性对话框中也填加一个network service用户,然后赋予本地访问权限.4 k% f* k' i* o6 |8 `
8.如果交互式用户设置后出现错误8000401a,可取消交互式用户,指定为administratr,可暂时解决此问题。进一步的解决方式还有待探讨。! \# g! Q8 h" ]2 B& f6 c
9.采用第8点的设置后,打开excel可能会出现“无法使用对象引用或链接”,并且不能进行单元格粘贴。原因不明,取消设置后即可消失。
8 ~: e* Q/ S; e9 ^8 K- B, Z7 s( ?以上是本人在近期作开发时的一点心得,现整理成文档,供奋战在程序开发一线的朋友共享,愿看到的网友能名帮助解决“无法使用对象引用或链接”的问题。
7 R) C. M2 N2 n* e$ w0 t/ K Q) d3 Y) V( y1 I: |9 j
更多网页制作信息请查看: 网页制作 |
|