??xml version="1.0" encoding="utf-8" standalone="yes"?>91久久久久,农村寡妇一区二区三区,麻豆成人在线播放http://www.aygfsteel.com/yongbing/articles/93240.html石?/dc:creator>石?/author>Thu, 11 Jan 2007 11:05:00 GMThttp://www.aygfsteel.com/yongbing/articles/93240.htmlhttp://www.aygfsteel.com/yongbing/comments/93240.htmlhttp://www.aygfsteel.com/yongbing/articles/93240.html#Feedback0http://www.aygfsteel.com/yongbing/comments/commentRss/93240.htmlhttp://www.aygfsteel.com/yongbing/services/trackbacks/93240.html ?Exception 处理之最佛_? 原文Qhttp://www.onjava.com/pub/a/onjava/2003/11/19/exceptions.html

作者:Gunjan Doshi 2003-11-19

译者注Q本文算是一学习笔讎ͼ仅供学习参考用,有不妥之处,q请指出?003-12-04



“本文是Exception处理的一不错的文章Q从Java Exception的概念介lvQ依ơ讲解了Exception的类型(Checked/UncheckedQ,Exception处理的最佛_玎ͼ

1Q?选择Checkedq是Unchecked的几个经怾?

2Q?Exception的封装问?

3Q?如无必要不要创徏自己得Exception

4Q?不要用Exception来作程控制

5Q?不要L的忽略捕LException

6Q?不要单地捕获层的Exception?

——选自JAVADigest.Net对原文的介绍



“JAVADigest.Netq个站点不知道大家是否经怸Q就像它的名字一P它让我们更加有效的消化JavaQ或者它像个中转站一P臛_Ҏ是这LQ有些好的可以说是非常经典的技术文章,我都是通过它第一ơ获得,更多的时候我是ؓ了偷懒才上JAVADigest.NetQ因为如果是q期比较l典的文章,它上辚w有介l文字和原文q接。?

——小插曲q常荣q地推荐JAVADigest.Netl你







关于异常处理的一个问题就是要对何ӞwhenQ和如何QhowQ用它们做C然于心。在本文中我介l一些关于异常处理的最佛_践,同时我也会涉及到最q争论十分激烈的checked Exception的用问题?

作ؓ开发员Q我们都希望能写决问题ƈ且是高质量的代码。不q的是,一些副作用Qside effectsQ伴随着异常在我们的代码中慢慢滋生。无庸置疑,没有人喜Ƣ副作用Qside effectsQ?所以我们很快就用我们自q方式来避免它Q我曄看到一些聪明的E序员用下面的方式来处理异常Q?



public void consumeAndForgetAllExceptions(){
try {
...some code that throws exceptions
} catch (Exception ex){
ex.printStacktrace();
}
}




上边的代码有什么问题么Q?



在回{以前让我们x怎样才是正确的?是的Q一旦程序碰到异常,它就该挂L序而“做”点什么。那么上边的代码是这样子的么Q看吧,它隐瞒了什么?它把所有的“苦水”往肚里咽(在控制台打印出异怿息)Q然后一切l,从表面上看就像什么都没有发生q一样……,很显Ӟ上边代码辑ֈ的效果ƈ不是我们所期望的?



后来又怎样Q?



public void someMethod() throws Exception{
}




上边的代码又有什么问题?



很明显,上边的方法体是空的,它不实现M的功能(没有一句代码)Q试问一个空Ҏ体能抛出什么异常?当然Javaq不L你这么干。最q,我也遇到cM的情景,Ҏ声明会抛出异常,但是代码中ƈ没有M“机会”来“展C”异常。当我问开发员Z么要q样做的时候,他回{我说“我知道Q它实有点那个Q但我以前就是这么干的ƈ且它实能ؓ我工作。?



在C++C֌曄׃数年实践来实践如何用异常,关于此类的争论在javaC֌才刚刚开始。我曄看到许多JavaE序员针对用异常的问题q行争论。如果对于异常处理不当的话,异常可以大大减慢应用E序的执行速度Q因为它消耗内存和CPU来创建、抛出ƈ捕获异常。如果过分的依赖异常处理Q代码对易读和易使用q两斚w产生影响Q以至于会让我们写出上边两处“糟p”代码?



异常原理



大体上说Q有三种不同的“情景”会D异常的抛出:

l ~程错误D异常QException due Programming errorsQ? q种情景下,异常往往处于~程错误Q如QNullPointerException 或?IllegalArgumentExceptionQ?q时异常一旦抛出,客户端将变得无能为力?

l 客户端代码错误导致异常(Exception due client code errorsQ? 说白点就是客L试图调用API不允许的操作?

l 资源p|D异常QException due to resource failuresQ? 如内存不x|络q接p|D出现异常{。这些异常的出现客户端可以采取相应的措施来恢复应用程序的l箋q行?



Java中异常的cd

Java 中定义了两类异常Q?

l Checked exception: q类异常都是Exception的子c?

l Unchecked exception: q类异常都是RuntimeException的子c,虽然RuntimeException同样也是Exception的子c,但是它们是特D的Q它们不能通过client code来试图解冻I所以称为Unchecked exception

举个例子Q下图ؓNullPointerException的承关p:


Figure 1. Sample exception hierarchy



图中QNullPointerExceptionl承自RuntimeExceptionQ所以它是Unchecked exception.



以往我都是应用checked exception多于Unchecked exceptionQ最q,在javaC֌Ȁ起了一场关于checked exception和用它们的价值的争论。这Zv源于JAVA是第一个拥有Checked exception的主OO语言q样一个事实,而C++和C#都是Ҏ没有Checked exceptionQ它们所有的异常都是unchecked?



一个checked exception它的客户端可以抛出ƈ捕获它,一旦客L不能有效地处理这些被抛出的异常就会给E序的执行带来不期望的负担?



Checked exceptionq可能带来封装泄漏,看下面的代码Q?



public List getAllAccounts() throws
FileNotFoundException, SQLException{
...
}




上边的方法抛Z个异常。客L必须昄的对q两U异常进行捕获和处理即是在完全不知道这U异常到底是因ؓ文gq是数据库操作引L情况下。因此,此时的异常处理将D一U方法和调用之间不合适的耦合?



接下来我会给出几U设计异常的最佛_?QBest Practises for Designing the APIQ?



1Q?当要军_是采用checked exceptionq是Unchecked exception的时候,你要问自׃个问题,“如果这U异怸旦抛出,客户端会做怎样的补救??

[原文QWhen deciding on checked exceptions vs. unchecked exceptions, ask yourself, "What action can the client code take when the exception occurs?"]

如果客户端可以通过其他的方法恢复异常,那么q种异常是checked exceptionQ如果客L对出现的q种异常无能为力Q那么这U异常就是Unchecked exceptionQ从使用上讲Q当异常出现的时候要做一些试图恢复它的动作而不要仅仅的打印它的信息QL的来_看下表:

Client's reaction when exception happens
Exception type

Client code cannot do anything
Make it an unchecked exception

Client code will take some useful recovery action based on information in exception
Make it a checked exception


此外Q尽量用unchecked exception来处理编E错误:因ؓunchecked exception不用使客L代码昄的处理它们,它们自己会在出现的地ҎL序ƈ打印出异怿息。Java API中提供了丰富的unchecked excetpionQ譬如:NullPointerException , IllegalArgumentException ?IllegalStateException{,因此我一般用这些标准的异常c而不愿亲自创建新的异常类Q这样我的代码易于理解q免的q多的消耗内存?



2Q?保护装性(Preserve encapsulationQ?

不要让你要抛出的checked exception升到较高的层次。例如,不要让SQLException延C务层。业务层q不需要(不关心?QSQLException。你有两U方法来解决q种问题Q?

l 转变SQLException为另外一个checked exceptionQ如果客Lq不需要恢复这U异常的话;

l 转变SQLExceptionZ个unchecked exceptionQ如果客L对这U异常无能ؓ力的话;

多数情况下,客户端代码都是对SQLException无能为力的,因此你要毫不犹U的把它{变ؓ一个unchecked exceptionQ看看下边的代码Q?



public void dataAccessCode(){
try{
..some code that throws SQLException
}catch(SQLException ex){
ex.printStacktrace();
}
}


上边的catch块紧紧打印异怿息而没有Q何的直接操作Q这是情有可原的Q因为对于SQLException你还奢望客户端做些什么呢Q(但是昄q种p什么事情都没发生一L做法是不可取的)那么有没有另外一U更加可行的Ҏ呢?



public void dataAccessCode(){
try{
..some code that throws SQLException
}catch(SQLException ex){
throw new RuntimeException(ex);
}
}




上边的做法是把SQLException转换为RuntimeExceptionQ一旦SQLException被抛出,那么E序抛出RuntimeException,此时E序被挂起ƈq回客户端异怿息?



如果你有_的信心恢复它当SQLException被抛出的时候,那么你也可以把它转换Z个有意义的checked exception, 但是我发现在大多时候抛出RuntimeException已经_用了?



3Q?不要创徏没有意义的异常(Try not to create new custom exceptions if they do not have useful information for client code.Q?

看看下面的代码有什么问题?

public class DuplicateUsernameException
extends Exception {}


它除了有一个“意义明”的名字以外没有M有用的信息了。不要忘记Exception跟其他的JavacMP客户端可以调用其中的Ҏ来得到更多的信息?

我们可以为其d一些必要的ҎQ如下:

public class DuplicateUsernameException
extends Exception {
public DuplicateUsernameException
(String username){....}
public String requestedUsername(){...}
public String[] availableNames(){...}
}



在新的代码中有两个有用的ҎQreqeuestedUsername(),客户但可以通过它得到请求的名称QavailableNames(),客户端可以通过它得Cl有用的usernames。这样客L在得到其q回的信息来明确自己的操作失败的原因。但是如果你不想d更多的信息,那么你可以抛Z个标准的Exception:

throw new Exception("Username already taken");



更甚的情况,如果你认为客Lq不想用q多的操作而仅仅想看到异常信息Q你可以抛出一个unchecked exception:

throw new RuntimeException("Username already taken");



另外Q你可以提供一个方法来验证该username是否被占用?



很有必要再重申一下,checked exception应该让客L从中得到丰富的信息。要惌你的代码更加易读Q请們֐于用unchecked excetpion来处理程序中的错误(Prefer unchecked exceptions for all programmatic errorsQ?



4Q?Document exceptions.

你可以通过Javadoc’s @throws 标签来说明(documentQ你的API中要抛出checked exception或者unchecked exception。然而,我更們֐于用来单元试来说明(documentQ异常。不你采用哪中方式Q你要让客户端代码知道你的API中所要抛出的异常。这里有一个用单元试来测试IndexOutOfBoundsException的例子:

public void testIndexOutOfBoundsException() {
ArrayList blankList = new ArrayList();
try {
blankList.get(10);
fail("Should raise an IndexOutOfBoundsException");
} catch (IndexOutOfBoundsException success) {}
}



上边的代码在hblankList.get(10)的时候会抛出IndexOutOfBoundsException,如果没有被抛出,fail("Should raise an IndexOutOfBoundsException")昄说明该测试失败。通过书写试异常的单元测试,你不但可以看到异常是怎样的工作的Q而且你可以让你的代码变得来健壮?





下面作者将介绍界中使用异常的最佛_践(Best Practices for Using ExceptionsQ?
1Q?L要做一些清理工作(Always clean up after yourselfQ?

如果你用一些资源例如数据库q接或者网l连接,误住要做一些清理工作(如关闭数据库q接或者网l连接)Q如果你的API抛出Unchecked exceptionQ那么你要用try-finally来做必要的清理工作:

public void dataAccessCode(){
Connection conn = null;
try{
conn = getConnection();
..some code that throws SQLException
}catch(SQLException ex){
ex.printStacktrace();
} finally{
DBUtil.closeConnection(conn);
}
}

class DBUtil{
public static void closeConnection
(Connection conn){
try{
conn.close();
} catch(SQLException ex){
logger.error("Cannot close connection");
throw new RuntimeException(ex);
}
}
}



DBUtil是一个工L来关闭Connection.有必要的说的使用的finally的重要性是不管E序是否到异常Q它都会被执行。在上边的例子中Qfinally中关闭连接,如果在关闭连接的时候出现错误就抛出RuntimeException.



2Q?不要使用异常来控制流E(Never use exceptions for flow controlQ?

下边代码中,MaximumCountReachedException被用于控制流E:

public void useExceptionsForFlowControl() {
try {
while (true) {
increaseCount();
}
} catch (MaximumCountReachedException ex) {
}
//Continue execution
}

public void increaseCount()
throws MaximumCountReachedException {
if (count >= 5000)
throw new MaximumCountReachedException();
}



上边的useExceptionsForFlowControl()用一个无限@环来增加count直到抛出异常Q这U做法ƈ没有说让代码不易读,但是它是E序执行效率降低?

CQ只在要会抛出异常的地方q行异常处理?



3Q?不要忽略异常

当有异常被抛出的时候,如果你不x复它Q那么你要毫不犹豫的其转换为unchecked exceptionQ而不是用一个空的catch块或者什么也不做来忽略它Q以至于从表面来看象是什么也没有发生一栗?



4Q?不要捕获层的Exception

unchecked exception都是RuntimeException的子c,RuntimeException又承Exception,因此Q如果单U的捕获Exception,那么你同样也捕获了RuntimeException,如下代码Q?

try{
..
}catch(Exception ex){
}


一旦你写出了上边的代码Q注意catch块是I的Q,它将忽略所有的异常Q包括unchecked exception.



5Q?Log exceptions just once

Logging the same exception stack trace more than once can confuse the programmer examining the stack trace about the original source of exception. So just log it once.



ȝ

q里l出了一些关于异常处理的一些最佛_践,我ƈ不想开始另一轮的关于checked exception ?unchecked exception的争论。你可以Ҏ自己的实际情况定制自己异常处理,我坚信我们将有更好的办法来处理我们代码中的异常?



在此Q我感谢Bruce Eckel, Joshua Kerievsky, 和Somik Raha对于写这文章所l于我的支持?

参考资源:

Related Resources
"Does Java need Checked Exceptions?" by Bruce Eckel
"Exceptional Java," by Alan Griffiths
"The trouble with checked exceptions: A conversation with Anders Hejlsberg, Part II" on Artima.com
"Checked exceptions are of dubious value," on C2.com
Conversation with James Gosling by Bill Venners
关于作者:

Gunjan Doshi works with agile methodologies and its practices and is a Sun certified Java programmer.

详细讨论?http://forum.javaeye.com/viewtopic.php?t=2038  受益匪浅


]]>
通过构造XML数据下载成Excel文g[转]http://www.aygfsteel.com/yongbing/articles/92394.html石?/dc:creator>石?/author>Mon, 08 Jan 2007 07:38:00 GMThttp://www.aygfsteel.com/yongbing/articles/92394.htmlhttp://www.aygfsteel.com/yongbing/comments/92394.htmlhttp://www.aygfsteel.com/yongbing/articles/92394.html#Feedback0http://www.aygfsteel.com/yongbing/comments/commentRss/92394.htmlhttp://www.aygfsteel.com/yongbing/services/trackbacks/92394.html 通过构造XML数据下载成Excel文g[原]

    前些天做了一个EXCEL数据下蝲的东?发现当数据超q?0万行之后,׃内存溢出(用的是本机TOMCAT试,内存有限,没能调过),新做一U方?来感觉一?发现速度有点?其他q可? 

一、问题描q?/span>

    该问题出现是因ؓ在导出文件之?/span> 用户下蝲的是 .csv 文gQ如果用文本~辑器打开可以查看所有记录,但是如果?/span> excel 打开出C?/span> sheet 最?/span> 6 万条的记录。因此就不可以用保存ؓ csv 文g来实?/span> excel 文g的下载,需要用新的方式去实现?/span>

    如果使用 jxl 开发包?/span> web 后台d?/span> Excel 文gQ如果数据量比较大,则用户需要等待很长很长的旉才可以下载到Q因?/span> jxl 的对?/span> excel 文g的操作都是对象?/span> , 文g中每一个格子都是一?/span> cell 对象Q需要后台去 new 。所以还需要考虑别的方式?/span>

   

二、实现灵?/span>

    Excel 文g打开之后选择另存为可以保存ؓ XML cd文gQ因此就考虑构造符?/span> Excel 可以打开?/span> XML cd文gQƈ且对?/span> XML 文gq行最单化处理Q去?/span> Excel 文g中的每个 cell ?/span> style 定义?/span> XML 文g头部的多余信息,最后整理出一个符合资讯^台所下蝲?/span> Excel 文g的格?/span> , L下面Q?/span>

 

 

<!—XML 文g头部 --//>

<?xml version="1.0"?>

<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"

 xmlns:o="urn:schemas-microsoft-com:office:office"

 xmlns:x="urn:schemas-microsoft-com:office:excel"

 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"

 xmlns:html="http://www.w3.org/TR/REC-html40">

 

<!—Excel 文gW一?/span> SHEET --//>

<Worksheet ss:Name="sheet0">

<Table>

<Row>

<Cell><Data ss:Type="String">aa0</Data></Cell>

<Cell><Data ss:Type="String">aa1</Data></Cell>

<Cell><Data ss:Type="String">aa2</Data></Cell>

</Row>

<Row>

<Cell><Data ss:Type="String">aa0</Data></Cell>

<Cell><Data ss:Type="String">aa1</Data></Cell>

<Cell><Data ss:Type="String">aa2</Data></Cell>

</Row>

</Table>

</Worksheet>

 

<!—Excel 文gW二?/span> SHEET --//>

<Worksheet ss:Name="sheet1">

<Table>

    <!? 一行数?/span> --//>

<Row>

<Cell><Data ss:Type="String">aa0</Data></Cell>

<Cell><Data ss:Type="String">aa1</Data></Cell>

<Cell><Data ss:Type="String">aa2</Data></Cell>

</Row>

<Row>

<Cell><Data ss:Type="String">aa0</Data></Cell>

<Cell><Data ss:Type="String">aa1</Data></Cell>

<Cell><Data ss:Type="String">aa2</Data></Cell>

</Row>

</Table>

</Worksheet>

 

</Workbook>

 

<!-- XML 文gl束 --//>

 

 

注释Q?/span>

a ?/span> <Worksheet ss:Name="sheet0">  引号内部的是?/span> sheet 的名U?/span>

b ?/span> <Data ss:Type="String">aa1</Data>  ss:Type 的值是用来定义?/span> cell 格数据的cdQ例如可以ؓ Number, 表是?/span> cell 格数据是数字?/span>

 

 

三、实现方?/span>

    通过W一步的分析可以发现只要我们构徏q样格式?/span> XML 数据Q就可以通过 Excel 打开Qƈ且可以实现分 sheet 的样式。但是数据下载到用户本地?/span> XML cd的话Q那是没什么意义的Q就打开方式选择使用 Excel 可以打开Q因此如何将用户下蝲的文件类型改?/span> XLS 呢?q里可以通过在下载的 servlet 中设|?/span> response.setContentType("application/vnd.ms-excel") 来实现?br /> 我实C五个cL闭XML字符?CellData,TableCell,TableRow,WorkBook,WorkSheet),写了一个测试类

package com.hoten.util.xmlxls;

import java.util.List;
import java.util.ArrayList;

public class WorkBook {
 private final static String XML_HEARDER = "<?xml version=\"1.0\"?>";
 
 private List sheetList = new ArrayList(); //存放每行多个sheet的list
 
 /**
  * 取得workbook的xml文g的头部字W串
  * @return
  */
 private String getHeader(){  
  return XML_HEARDER +
    "<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"" + Contants.SEP_N +
    " xmlns:o=\"urn:schemas-microsoft-com:office:office\"" + Contants.SEP_N +
    " xmlns:x=\"urn:schemas-microsoft-com:office:excel\"" +  Contants.SEP_N +
    " xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\"" + Contants.SEP_N +
    " xmlns:html=\"http://www.w3.org/TR/REC-html40\">" + Contants.SEP_N ;
 } 
 
 private String getFoot(){
  return "</Workbook>";
 }
 
 public String toString(){
  StringBuffer strBuff = new StringBuffer();
  
  strBuff.append(getHeader());
  
  int len = sheetList.size();
  for(int i=0;i<len;i++){
   WorkSheet sheet = (WorkSheet)sheetList.remove(0);
   strBuff.append(sheet.toString());
   sheet = null;
  }  
  sheetList.clear();
  
  strBuff.append(getFoot());
  
  return strBuff.toString();
 }
 
 public void addSheet(WorkSheet sheet){
  sheetList.add(sheet);
 }
 
 public void removeSheet(int i){
  sheetList.remove(i);
 }  
}


package com.hoten.util.xmlxls;

import java.util.List;
import java.util.ArrayList;

public class WorkSheet {
 
 private String name = ""; //该sheet的name
 
 private List rowList = new ArrayList(); //存放每行多个row的list
 
 public String toString(){
  StringBuffer strBuff = new StringBuffer();
  
  strBuff.append("<Worksheet ss:Name=\"" + name + "\">").append(Contants.SEP_N);
  strBuff.append("<Table>").append(Contants.SEP_N);
  
  int len = rowList.size();
  for(int i=0;i<len;i++){
   TableRow row = (TableRow)rowList.remove(0);
   strBuff.append(row.toString());
   row = null;
  }  
  rowList.clear();
  
  strBuff.append("</Table>").append(Contants.SEP_N);
  strBuff.append("</Worksheet>").append(Contants.SEP_N);
  
  return strBuff.toString();
 }
 
 public void addRow(TableRow row){
  rowList.add(row);
 }
 
 public void removeRow(int i){
  rowList.remove(i);
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 } 
}


package com.hoten.util.xmlxls;

import java.util.List;
import java.util.ArrayList;

public class TableRow {

 private List cellList = new ArrayList(); //存放每行多个cell的list
 
 
 public String toString(){
  StringBuffer strBuff = new StringBuffer();
  
  strBuff.append("<Row>").append(Contants.SEP_N);

  //循环昄每行的cell
  int len = cellList.size();
  for(int i=0;i<len;i++){
   TableCell cell = (TableCell)cellList.remove(0);
   strBuff.append(cell.toString()).append(Contants.SEP_N);
   cell = null;   
  }
  cellList.clear();
  
  strBuff.append("</Row>").append(Contants.SEP_N);
  
  return strBuff.toString();
 } 
 
 public void addCell(TableCell cell){
  cellList.add(cell);
 }
 
 public void removeCell(int i){
  cellList.remove(i);
 }
 
}


package com.hoten.util.xmlxls;

public class TableCell {
 private String index = ""; //cell在每行显C的索引位置,可以不填
 
 private CellData data = new CellData(); //cell的数据对?/o:p>

 public CellData getData() {
  return data;
 }

 public void setData(CellData data) {
  this.data = data;
 }

 public String getIndex() {
  return index;
 }

 public void setIndex(String index) {
  this.index = index;
 }
 
 
 public String toString(){
  return "<Cell>" + data.toString() + "</Cell>";
 }
 
}


package com.hoten.util.xmlxls;

public class CellData {
 private String type = "String"; //cell数据cd
 private String value = ""; //cell数据
 
 public String getType() {
  return type;
 }
 public void setType(String type) {
  this.type = type;
 }
 public String getValue() {
  return value;
 }
 public void setValue(String value) {
  this.value = value;
 }
 
 
 public String toString(){
  return "<Data ss:Type=\"" + type + "\">" + value + "</Data>";
 }
}



package com.hoten.util.xmlxls;

public class Contants {
 public final static String SEP_N = "\n";
 /**
  * XML中常量定?br />  */
 public final static String SS_NAME = "ss:Name";
 public final static String SS_INDEX = "ss:Index";
 public final static String SS_TYPE = "ss:Type";

}



试的方?
PrintWriter out = response.getWriter();
         // 讄响应头和下蝲保存的文件名
         response.setContentType("application/vnd.ms-excel");
         response.setHeader("Content-Disposition","attachment; filename=\""+Chinese.toPage(fileNametemp)+"\"");
        
         String rows_temp = request.getParameter("rows");//面传过来的每个SHEET可以存放的条?br />   if (rows_temp == null){
    rows_temp = "20000";
   }
   int count_rows = Integer.parseInt(rows_temp);//一个SHEET有多?br />        
         WorkBook book = new WorkBook();
         Vector v_Rs = RsToVector.ResultSetToVector(rs);// 把RS的D{换成VECTOR,q个可以看我上一版本,上面有详l的写法
         
         if (v_Rs != null) {
    int a = v_Rs.size();    
    int sheet_count = a / count_rows;// 30000行一个sheet?br />    
    if (sheet_count >0){//大于0Q则需要多个SHEET
     for (int i = 0;i<sheet_count;i++){
      WorkSheet sheet = new WorkSheet();//创徏一个新的SHEET
      sheet.setName("sheet" + i);//讄SHEET的名U?br />           
      for (int b = i* count_rows ;b<(i+1) * count_rows ;b++){       
       //temp_v.add(v_Rs.get(b));
       Vector temp_v = new Vector();
       temp_v =(Vector) v_Rs.get(b);       
       //取出一个对?把对象的值放到EXCEL?br />       TableRow row = new TableRow();//讄行?br />       for(int m=0;m<numColumns;m++){
              TableCell cell = new TableCell();
              CellData data = new CellData();
              data.setValue((String)temp_v.get(m));
              cell.setData(data);              
              row.addCell(cell);
             }             
             sheet.addRow(row);
      } 
      book.addSheet(sheet);
     }
     //q有剩余的数?br />     if (sheet_count * count_rows < a){
      WorkSheet sheet = new WorkSheet();//创徏一个新的SHEET
      sheet.setName("sheet" + sheet_count);//讄SHEET的名U?br />       
      for (int c = sheet_count* count_rows ;c<a ;c++){       
       Vector temp_vv = new Vector();
       temp_vv =(Vector) v_Rs.get(c);
       //取出一个对?把对象的值放到EXCEL?br />       TableRow row = new TableRow();//讄?br />       for(int m=0;m<numColumns;m++){
              TableCell cell = new TableCell();
              CellData data = new CellData();
              data.setValue((String)temp_vv.get(m));
              cell.setData(data);              
              row.addCell(cell);
             }             
             sheet.addRow(row);       
      }
      book.addSheet(sheet);       
     }
    }else{
     
     
      WorkSheet sheet = new WorkSheet();//创徏一个新的SHEET
      sheet.setName("sheet1");//讄SHEET的名U?br />           
      for (int bb=0  ;bb<a ;bb++){       
       //temp_v.add(v_Rs.get(b));
       Vector temp_v = new Vector();
       temp_v =(Vector) v_Rs.get(bb);       
       //取出一个对?把对象的值放到EXCEL?br />       TableRow row = new TableRow();//讄行?br />       for(int m=0;m<numColumns;m++){
              TableCell cell = new TableCell();
              CellData data = new CellData();
              data.setValue((String)temp_v.get(m));
              cell.setData(data);              
              row.addCell(cell);
             }             
             sheet.addRow(row);
      } 
      book.addSheet(sheet);
    }
        
    out.print(book.toString());
   }
    以上拼XML的时候重复代码比较多,可以写一个公用的Ҏ,,我ؓ了把XML描述的详l一?把这些都装成了对象,但在拼字W串的时?对象׃太多,以后如果改版的话,可以把它量装一点对?q样速度可能会快一?内存可能会少用一?

 

?: http://www.aygfsteel.com/wujiaqian/archive/2006/12/11/86970.html



]]>
ҎRS取值的条数,动态生成EXCEL的工作簿[转] http://www.aygfsteel.com/yongbing/articles/92392.html石?/dc:creator>石?/author>Mon, 08 Jan 2007 07:35:00 GMThttp://www.aygfsteel.com/yongbing/articles/92392.htmlhttp://www.aygfsteel.com/yongbing/comments/92392.htmlhttp://www.aygfsteel.com/yongbing/articles/92392.html#Feedback0http://www.aygfsteel.com/yongbing/comments/commentRss/92392.htmlhttp://www.aygfsteel.com/yongbing/services/trackbacks/92392.html ҎRS取值的条数,动态生成EXCEL的工作簿[原]

      以前公司在做下蝲数据的时?主要是用以下q种方式Q?br />
      response.setContentType("APPLICATION/OCTET-STREAM");

      response.setHeader("Content-Disposition", "attachment; filename=\""+ Chinese.toPage(fileName) + "\"");


      但这有个不好的就是它只能打开一个EXCEL的一个工作簿Q如果数据量非常大的话,后面的数据会丢失Q根据这个BUGQ我重新做了一个动态生成EXCEL工作薄的例子Q以方便后面Ҏ应用的改造?br />
 首先从数据库里取数据的时候,不知道行Q列Q这样就需要一个动作,把RS转换成一个VECTORQ此对象里每一行也是一个VECTOR
  public static Vector ResultSetToVector(ResultSet rs) {
    try {
      Vector rows = new Vector();
      ResultSetMetaData rsmd = rs.getMetaData();
      Vector columnHeads = new Vector();

      for (int i = 1; i <= rsmd.getColumnCount(); i++) {
        columnHeads.addElement(rsmd.getColumnName(i));
      }

      Vector currentRow;
      while(rs.next()){
        currentRow = new Vector();
        for (int i = 1; i <= rsmd.getColumnCount(); i++) {
          currentRow.addElement(Chinese.fromDatabase(rs.getString(i)));
        }
        rows.addElement(currentRow);
      }
      return rows;
    }
    catch (Exception err) {
      Log.printError(err, "", "", log);
      return null;
    }
    finally{
      try {
        if(rs!=null){
          rs.close();
          rs = null;
        }
      }
      catch (Exception ex) {
      }
    }

 再通过写一个方法,把VECTOR的值放到EXCEL里去?br />   ResultSetMetaData rmeta = rs.getMetaData();
   int numColumns = rmeta.getColumnCount();//取多行
   String fileNametemp = "c:\\"+fileName;
   fileNametemp = fileNametemp.substring(0,fileNametemp.lastIndexOf("."))+CTime.getTime(12)+".xls";
   
   java.io.File file = new java.io.File(fileNametemp);
   if (file.exists()) {
    file.delete();
   }
   String rows_temp = request.getParameter("rows");//面传过来的每个SHEET可以存放的条?br />   if (rows_temp == null){
    rows_temp = "20000";// 一个表单默?0000行?br />   }
   int count_rows = Integer.parseInt(rows_temp);
   WritableWorkbook wb = Workbook.createWorkbook(file);
     
    Vector v_Rs = RsToVector.ResultSetToVector(rs);// 把RS的D{换成VECTOR
   boolean fg = true;    
    if (v_Rs != null) {
    int a = v_Rs.size();    
    int sheet_count = a / count_rows;    
    if (sheet_count >0){//大于0Q则需要多个SHEET
     for (int i = 0;i<sheet_count;i++){
      Vector temp_v = new Vector();
      for (int b = i* count_rows ;b<(i+1) * count_rows ;b++){
       
       temp_v.add(v_Rs.get(b));
      }      
      writeExcel(wb,"sheet"+i,temp_v,numColumns,sheet_count);//EXCEL对象、单元薄名、数据、行数、第几个单元薄     ?br />     }    
     
     if (sheet_count * count_rows < a){//不是正好Q还有剩?br />      Vector temp_vv = new Vector();
      for (int c = sheet_count* count_rows ;c<a ;c++){       
       temp_vv.add(v_Rs.get(c));
      }
      writeExcel(wb,"sheet"+(sheet_count+1),temp_vv,numColumns,sheet_count+1);//EXCEL对象、单元薄名、数据、行数、第几个单元薄?br />     }
    }else{
     writeExcel(wb,"sheet"+sheet_count,v_Rs,numColumns,0);//EXCEL对象、单元薄名、数据、行数、第几个单元薄?br />    }
    fg = true;
   }else{
    fg = false;
   }
   wb.write();
   wb.close();
   String msgs = "";
   PrintWriter out = response.getWriter();
   if (fg){
    msgs = "保存的文件名?+fileNametemp;
    msgs = Chinese.toPage(msgs);    
   }else{
    msgs = Chinese.toPage("没有数据导出Q?);    
   }
   int seg = msgs.indexOf(":");
   msgs = msgs.substring(0,seg)+":\\"+msgs.substring(seg+1,msgs.length());
   out.println("<script>alert('"+msgs+"');window.close();</script>");


   
写EXCLE的方?br />   /**
     * 写Excel文g
     * @param filepath String
     * @param sheetname String  工作名U?br />     * @param list Vector   内容
     * @param colum int     列数
     * @return boolean
     */
 private boolean writeExcel(WritableWorkbook wb ,String sheetname,
   Vector list, int colum,int count) {
  String temp = "";
  String[] s;
  int i = 0;
  try {
   if (list == null) {
    return false;
   }
   
   WritableSheet ws = wb.createSheet(sheetname, count);
   if (colum == 1) {
    while (i != list.size() && list.size() > 0) {
     temp = (String) list.get(i);
     Label labelC = new Label(i, 0, temp);
     ws.addCell(labelC);
     i++;
    }
   } else {
    while (i != list.size() && list.size() > 0) {
     //s = (String[]) list.get(i);
     Vector tm = (Vector) list.get(i);
     if (tm == null) {
      continue;
     } else {
      int kk = tm.size();
      for (int j = 0; j < kk; j++) {
       temp = (String)tm.get(j);
       Label labelC = new Label(j, i, temp);
       ws.addCell(labelC);
      }
     }
     i++;
    }
   }
  } catch (Exception ex) {
   Log.printError(ex, "写excel文g错误", "", "writeexcel.log");
   return false;
  }
  return true;
 }



以上Ҏ也有一个问题,是当程序写100000条数据以后,速度会慢下来Q我看了WritableWorkbook 的构造方法的时候,可以生成一个OUTPUTSTREAM对象的,我想可以用这个来做,速度可能会上去,但具体也没有试,如何有哪位哥们试q了Q把性能跟兄弟分享一下!谢谢了!

转自 : http://www.aygfsteel.com/wujiaqian/archive/2006/12/08/86269.html



]]>
用JXL写EXCELҎ的封装[转] http://www.aygfsteel.com/yongbing/articles/92382.html石?/dc:creator>石?/author>Mon, 08 Jan 2007 07:19:00 GMThttp://www.aygfsteel.com/yongbing/articles/92382.htmlhttp://www.aygfsteel.com/yongbing/comments/92382.htmlhttp://www.aygfsteel.com/yongbing/articles/92382.html#Feedback0http://www.aygfsteel.com/yongbing/comments/commentRss/92382.htmlhttp://www.aygfsteel.com/yongbing/services/trackbacks/92382.html 前些日子写了一些关于EXCEL解决的方?今天用JXL写文件的Ҏ,来处理。把装好的东西发上来,大家一L看?br />
import java.util.*;
import java.io.*;
import java.sql.*;
import jxl.*;
import jxl.write.*;

/**
 * 提供了常用的Exceld和写入的Ҏ
 * <p> * Title: * </p>
 * <p> * Description: * </p>
 * <p> * Copyright: Copyright (c) 2006 * </p>
 * <p> * Company: * </p>
 *  * @author wujiaqian * @version 1.0
 */

public class Excel {
 int sheetCount = 1; // excel工作,默认?

 WritableWorkbook wwb = null; // 构徏Workbook对象,只读Workbook对象

 Vector vSheet = null;

 /**
  * 无参构造函敎ͼ生成默认名字的excel文g
  */
 public Excel() {
  this("noName.excel");
 }

 /**
  * 带有一个Stringcd参数的构造函?br />  *
  * @param fileName
  * String 要生成的excel文g?br />  */
 public Excel(String fileName) {
  try {
   wwb = Workbook.createWorkbook(new File(fileName));
   vSheet = new Vector(5);
  } catch (Exception e) {
  }
 }

 /**
  * 带有一个Filecd参数的构造函?br />  *
  * @param fileName
  *  String 要生成的excel文g?br />  */
 public Excel(File file) {
  try {
   wwb = Workbook.createWorkbook(file);
   vSheet = new Vector(5);
  } catch (Exception e) {
  }
 }

 /**
  * d一个EXCEL文g的所有行和列,在同一行上的数据以一个String的Ş式保存在Vector?各列数据?,"号分?br />  *
  * @param fileName
  *        String 文g?br />  * @throws Exception
  * @return Vector
  */
 public static Vector readFromExcel(String fileName) throws Exception {
  Vector v = new Vector();
  File file = new File(fileName);
  if (!file.isFile()) {
   return null;
  }
  v = readExl(file, -1, -1);
  return v;
 }

 public static Vector readFromExcel(File file) throws Exception {
  Vector v = new Vector();
  if (!file.isFile()) {
   return null;
  }
  v = readExl(file, -1, -1);
  return v;
 }

 /**
  * d一行多列或者一列多?br />  *
  * @param fileName
  *        String 文g?br />  * @param rowORcol
  *        int W几行或者第几列
  * @param flag
  *        String ROW表示前面一个参数的值指的是行数Q行COL表示前面一个参数的值指的是列数
  * @throws Exception
  * @return Vector
  */
 public static Vector readFromExcel(String fileName, int rowORcol,
   String flag) throws Exception {
  Vector v = new Vector();
  File file = new File(fileName);
  if (!file.isFile()) {
   return null;
  }
  if (flag != null && flag.equals("ROW")) {
   v = readExl(file, rowORcol, -1);
  } else if (flag != null && flag.equals("COL")) {
   v = readExl(file, -1, rowORcol);
  } else {
   return null;
  }
  return v;
 }

 public static Vector readFromExcel(File file, int rowORcol, String flag)
   throws Exception {
  Vector v = new Vector();
  if (!file.isFile()) {
   return null;
  }
  if (flag != null && flag.equals("ROW")) {
   v = readExl(file, rowORcol, -1);
  } else if (flag != null && flag.equals("COL")) {
   v = readExl(file, -1, rowORcol);
  } else {
   return null;
  }

  return v;
 }

 /**
  * d多行或者多?可以L挑选几行或几列
  *
  * @param fileName
  *        String 文g?br />  * @param rowORcol
  *        int L的行或列
  * @param flag
  *        String ROW表示行COL表示?br />  * @throws Exception
  * @return Vector
  */
 public static Vector readFromExcel(String fileName, int[] rowORcol,
   String flag) throws Exception {
  Vector v = new Vector();
  return v;
 }

 public static Vector readFromExcel(File file, int[] rowORcol, String flag)
   throws Exception {
  Vector v = new Vector();
  return v;
 }

 /**
  * dW几行第几列的一个数?br />  *
  * @param fileName
  *            String
  * @param row
  *            int
  * @param col
  *            int
  * @throws Exception
  * @return String
  */
 public static String readFromExcel(String fileName, int row, int col)
   throws Exception {
  String res = null;
  File file = new File(fileName);
  if (!file.isFile()) {
   return null;
  }
  return res;
 }

 public static String readFromExcel(File file, int row, int col)
   throws Exception {
  String res = null;
  if (!file.isFile()) {
   return null;
  }

  return res;
 }

 /**
  * dxls文g
  *
  * @param f
  *        File 文g
  * @param row
  *        int d?到row?br />  * @param col
  *        int d?到col?br />  * @throws Exception
  * @return Vector
  */

 private static Vector readExl(File f, int row, int col) throws Exception {
  Vector v = new Vector();
  Workbook wb = null;
  Sheet st = null;
  wb = Workbook.getWorkbook(f);
  st = wb.getSheet(0);
  int allRow = st.getRows();
  if (row == -1) {
   row = allRow;
  }
  int allCol = st.getColumns();
  if (col == -1) {
   col = allCol;
  }
  for (int i = 0; i < row; i++) {
   String sRow = null;
   for (int j = 0; j < col; j++) {
    Cell c1 = st.getCell(j, i);
    String sCol = c1.getContents();
    if (j == 0) {
     sRow = sCol;
    } else {
     if (sCol != null) {
      sRow = sRow + "," + sCol;
     } else {
      sRow = sRow + "," + "";
     }
    }
    c1 = null;
    sCol = null;
   }
   v.addElement(sRow);
   sRow = null;
  }

  st = null;
  wb.close();
  wb = null;
  return v;
 }

 public void addSheet() throws Exception {
  addSheet(String.valueOf(sheetCount));
 }

 public void addSheet(String sheetName) throws Exception {

  // 创徏Excel工作?br />  WritableSheet ws = wwb.createSheet(sheetName, sheetCount);
  vSheet.addElement(ws);
  sheetCount++;
 }

 /**
  * 为工作表d内容,指定d到第几列
  *
  * @param v
  *        Vector 要添加到工作表的内容 格式
  *        String,String,String,String,...,...,...,..., 每列内容以逗号隔开
  * @param col
  *        int 指定列数
  * @throws Exception
  */
 public void addContent(Vector v, int col) throws Exception {
  WritableSheet ws = (WritableSheet) vSheet.get(sheetCount - 2);

  int size = v.size();
  try {
   for (int i = 0; i < size; i++) {
    String s = (String) v.get(i);
    String[] s1 = s.split(",");
    for (int j = 0; j < col; j++) {
     Label label = new Label(j, i, s1[j]);

     ws.addCell(label);
     label = null;
    }
   }
  } catch (ArrayIndexOutOfBoundsException e) {
   throw new ArrayIndexOutOfBoundsException("check column!");
  }
  ws = null;
 }

 /**
  * 为工作表d内容,不指定添加几?br />  *
  * @param v
  *        Vector 要添加到工作表的内容 格式
  *        String,String,String,String,...,...,...,..., 每列内容以逗号隔开
  * @throws Exception
  */
 public void addContent(Vector v) throws Exception {
  WritableSheet ws = (WritableSheet) vSheet.get(sheetCount - 2);

  int size = v.size();
  try {
   for (int i = 0; i < size; i++) {
    String s = (String) v.get(i);
    String[] s1 = s.split(",");
    int col_size = s1.length;
    for (int j = 0; j < col_size; j++) {
     Label label = new Label(j, i, s1[j]);

     ws.addCell(label);
     label = null;
    }
   }
  } catch (Exception e) {
   throw new Exception();
  }
  ws = null;
 }

 /**
  * 为工作表d内容,不指定添加几?br />  *
  * @param rs
  *        ResultSet 从数据库中得到的l果?br />  * @throws Exception
  */
 public void addContent(ResultSet rs) throws Exception {
  if (rs == null) {
   return;
  }
  WritableSheet ws = (WritableSheet) vSheet.get(sheetCount - 2);
  ResultSetMetaData rsMetaD = rs.getMetaData();
  int col = rsMetaD.getColumnCount();
  int i = 0;
  while (rs.next()) {
   for (int j = 0; j < col; j++) {
    Label label = new Label(j, i, rs.getString(j));// Chinese.fromDatabase(rs.getString(j))
    ws.addCell(label);
    label = null;
   }
   i++;
  }
 }

 /**
  * 最l生成excel文g
  *
  * @throws Exception
  */
 public void createExcel() throws Exception {
  wwb.write();
  wwb.close();
 }

 public static void main(String[] args) {
  Excel t = new Excel("d:\\test.xls");
  Vector v = new Vector();
  try {
   v.addElement("ding,wen,yuan");
   v.addElement("ding,wen,yuan");
   t.addSheet("first");
   t.addContent(v, 3);

   v.clear();
   v.addElement("xuhy,hai,yong");
   v.addElement("xuhy,hai,yong");
   t.addSheet("second");
   t.addContent(v, 3);

   v.clear();
   v.addElement("wu,jia,qian");
   v.addElement("wu,jia,qian");
   t.addSheet("third");
   t.addContent(v, 3);

   t.createExcel();
  } catch (Exception e) {
   e.printStackTrace();
  }

 }

}

转自:http://www.aygfsteel.com/wujiaqian/archive/2006/12/21/89308.html?Pending=true#Post



]]>
վ֩ģ壺 ʳ| ɣ| Ͷ| | ϳ| | | | ǰ| | | Դ| | | | ޳| ٹ| ɳ| | | | | ͼʲ| | ױ| | °| | Ӻ| | ƽ| ŷ| | ̨| | | ͷ| | | Խ| û|