您的位置:首页 > 其它

用POI把数据导出为Excel

2009-06-18 17:32 423 查看
(一)SheetDataSource.java

代码

package com.javaeye.yongsky;

import java.sql.*;

import java.util.*;

import com.microsoft.jdbc.*;

public class SheetDataSource {

private static Connection con ;

private static final String DatabaseName = "POIDEMO";

private static final String userName = "sa";

private static final String password = "123";

public SheetDataSource()

{

try {

Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");

try {

con = DriverManager.getConnection("jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName="+DatabaseName,userName,password);

} catch (SQLException e) {

e.printStackTrace();

}

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

public static ResultSet selectAllDataFromDB() throws SQLException

{

new SheetDataSource();

Statement stmt = con.createStatement();

return stmt.executeQuery("select * from COMPANY");

}

}

<script type="text/javascript">render_code();</script>
上面部分代码主要是从数据库里面取出数据,作为Excel的数据源.

(二)PoiDemo.java

代码

package com.javaeye.yongsky;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStream;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.*;

import javax.swing.JOptionPane;

import org.apache.poi.hssf.usermodel.HSSFCell;

import org.apache.poi.hssf.usermodel.HSSFFooter;

import org.apache.poi.hssf.usermodel.HSSFHeader;

import org.apache.poi.hssf.usermodel.HSSFRow;

import org.apache.poi.hssf.usermodel.HSSFSheet;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

public class PoiDemo {

//表头

public static final String[] tableHeader = {"企业中文名","所属国家","企业英文名","2003年排名","2004年排名","2005年排名",

"2006年排名","2007年排名","主要业务","2003年营业额","2004年营业额","2005年营业额","2006年营业额","2007年营业额","企业编号","名次升降",

"图片","状况"};

//创建工作本

public static HSSFWorkbook demoWorkBook = new HSSFWorkbook();

//创建表

public static HSSFSheet demoSheet = demoWorkBook.createSheet("The World's 500 Enterprises");

//表头的单元格个数目

public static final short cellNumber = (short)tableHeader.length;

//数据库表的列数

public static final int columNumber = 18;

/**

* 创建表头

* @return

*/

public static void createTableHeader()

{

HSSFHeader header = demoSheet.getHeader();

header.setCenter("世界五百强企业名次表");

HSSFRow headerRow = demoSheet.createRow((short) 0);

for(int i = 0;i < cellNumber;i++)

{

HSSFCell headerCell = headerRow.createCell((short) i);

headerCell.setEncoding(HSSFCell.ENCODING_UTF_16);

headerCell.setCellValue(tableHeader[i]);

}

}

/**

* 创建行

* @param cells

* @param rowIndex

*/

public static void createTableRow(List<string> cells,</string>short rowIndex)

{

//创建第rowIndex行

HSSFRow row = demoSheet.createRow((short) rowIndex);

for(short i = 0;i < cells.size();i++)

{

//创建第i个单元格

HSSFCell cell = row.createCell((short) i);

cell.setEncoding(HSSFCell.ENCODING_UTF_16);

cell.setCellValue(cells.get(i));

}

}

/**

* 创建整个Excel表

* @throws SQLException

*

*/

public static void createExcelSheeet() throws SQLException

{

createTableHeader();

ResultSet rs = SheetDataSource.selectAllDataFromDB();

int rowIndex = 1;

while(rs.next())

{

List<string> list = new ArrayList<string>(); </string></string>

for(int i = 1;i <= columNumber;i++)

{

list.add(rs.getString(i));

}

createTableRow(list,(short)rowIndex);

rowIndex++;

}

}

/**

* 导出表格

* @param sheet

* @param os

* @throws IOException

*/

public void exportExcel(HSSFSheet sheet,OutputStream os) throws IOException

{

sheet.setGridsPrinted(true);

HSSFFooter footer = sheet.getFooter();

footer.setRight("Page " + HSSFFooter.page() + " of " +

HSSFFooter.numPages());

demoWorkBook.write(os);

}

public static void main(String[] args) {

String fileName = "D://世界五百强企业名次表.xls";

FileOutputStream fos = null;

try {

PoiDemo pd = new PoiDemo();

pd.createExcelSheeet();

fos = new FileOutputStream(fileName);

pd.exportExcel(demoSheet,fos);

JOptionPane.showMessageDialog(null, "表格已成功导出到 : "+fileName);

} catch (Exception e) {

JOptionPane.showMessageDialog(null, "表格导出出错,错误信息 :"+e+"/n错误原因可能是表格已经打开。");

e.printStackTrace();

} finally {

try {

fos.close();

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

source_code.rar (1.1 MB)

下载次数: 1050

评论

5 楼 westlee 2008-06-29 回复
回答hdljavaeye 问题,这是我的小小经验,有可能不对,但请大学改正。
第一个问题回答:POI中可以取多种数据类型,如日期,浮点等,只不过是字符是最好操作的,取值也是通过getXXX来得到。
第二个问题回答:在POI中如果是要向填充数据而不是读,最好的办法是先创建一行,再创建列,有多少列则需创建多少列,不过要注意字符的编码问题。其实就是一个道理先创建后操作。
上边就是我的一点理解。

4 楼 hdljavaeye 2008-06-28 回复
看过你的DEMO后,有几个问题想请教一下!
一 你所写的程序中,在获取rs的值时,怎么判断数据库中的字段类型?只能取单一类型的吗?不过,在jxl包中有几种类型可以选择:label,number.......POI中怎么实现!
二 POI中控制行的输出比较容易,可是控制列呢?比如说你的那个tableHeader是个动态的String 数组呢,怎么能够控制列的输出!不过在jxl包中也没发现这个功能!
贴出一段代码:

Java代码



public static void getXLSData(List list,String[] aTitle,OutputStream os) {

// 准备设置excel工作表的标题

try {

// 获得开始时间

long start = System.currentTimeMillis();

// 创建Excel工作薄

WritableWorkbook wwb;

// 新建立一个jxl文件,即在C盘下生成test.xls

// OutputStream os = new FileOutputStream(filePath);

wwb = Workbook.createWorkbook(os);

// 添加第一个工作表并设置第一个Sheet的名字

WritableSheet sheet = wwb.createSheet("零售商库存//促销准备库存//五天质询表身", 0);

Label label;

for (int i = 0; i < aTitle.length; i++) {

// Label(x,y,z)其中x代表单元格的第x+1列,第y+1行, 单元格的内容是y

// 在Label对象的子对象中指明单元格的位置和内容

label = new Label(i, 0, aTitle[i]);

// 将定义好的单元格添加到工作表中

sheet.addCell(label);

}

SMSStockDVO objSMSStockDVO = null;

Iterator iter = list.iterator();

while (iter.hasNext()) {

for (int j = 1; j <= list.size(); j++) {

//遍历 SMSTerminalPromoInfoVO中所有的值

objSMSStockDVO = (SMSStockDVO) iter.next();

String strStockHId = objSMSStockDVO.getStockHId();

String strStockDId = objSMSStockDVO.getStockDId();

String strMaterialId = objSMSStockDVO.getMaterialId();

String strMaterialDesc = objSMSStockDVO.getMaterialDesc();

String strMaterialSpec = objSMSStockDVO.getMaterialSpec();

double dQTY = objSMSStockDVO.getDoubleQty();

double dPrice = objSMSStockDVO.getDoublePrice();

double dOther =objSMSStockDVO.getDoubleOther();

// 下面是填充数据

/*

* 保存数字到单元格,需要使用jxl.write.Number 必须使用其完整路径,否则会出现错误

*/

// 填充产品编号

label = new Label(0, j, strStockHId);

sheet.addCell(label);

label = new Label(1, j, strStockDId);

sheet.addCell(label);

label = new Label(2, j, strMaterialId);

sheet.addCell(label);

label = new Label(3, j, strMaterialDesc);

sheet.addCell(label);

label = new Label(4, j, strMaterialSpec);

sheet.addCell(label);

jxl.write.Number numbQTY = new jxl.write.Number(5, j, dQTY);

sheet.addCell(numbQTY);

jxl.write.Number numbPrice = new jxl.write.Number(6, j, dPrice);

sheet.addCell(numbPrice);

jxl.write.Number numbOther = new jxl.write.Number(7, j, dOther);

sheet.addCell(numbOther);

}

}

wwb.write();// 写入数据

wwb.close();// 关闭文件

os.close();

long end = System.currentTimeMillis();

} catch (Exception e) {

System.out.println("---出现异常---");

e.printStackTrace();

}

}

}

public static void getXLSData(List list,String[] aTitle,OutputStream os) {

// 准备设置excel工作表的标题
try {
// 获得开始时间
long start = System.currentTimeMillis();
// 创建Excel工作薄
WritableWorkbook wwb;
// 新建立一个jxl文件,即在C盘下生成test.xls
//			OutputStream os = new FileOutputStream(filePath);
wwb = Workbook.createWorkbook(os);
// 添加第一个工作表并设置第一个Sheet的名字
WritableSheet sheet = wwb.createSheet("零售商库存//促销准备库存//五天质询表身", 0);
Label label;
for (int i = 0; i < aTitle.length; i++) {
// Label(x,y,z)其中x代表单元格的第x+1列,第y+1行, 单元格的内容是y
// 在Label对象的子对象中指明单元格的位置和内容
label = new Label(i, 0, aTitle[i]);
// 将定义好的单元格添加到工作表中
sheet.addCell(label);
}
SMSStockDVO objSMSStockDVO = null;
Iterator iter = list.iterator();
while (iter.hasNext()) {
for (int j = 1; j <= list.size(); j++) {
//遍历 SMSTerminalPromoInfoVO中所有的值
objSMSStockDVO = (SMSStockDVO) iter.next();
String strStockHId = objSMSStockDVO.getStockHId();
String strStockDId = objSMSStockDVO.getStockDId();
String strMaterialId = objSMSStockDVO.getMaterialId();
String strMaterialDesc = objSMSStockDVO.getMaterialDesc();
String strMaterialSpec = objSMSStockDVO.getMaterialSpec();
double dQTY = objSMSStockDVO.getDoubleQty();
double dPrice = objSMSStockDVO.getDoublePrice();
double dOther =objSMSStockDVO.getDoubleOther();
// 下面是填充数据
/*
* 保存数字到单元格,需要使用jxl.write.Number 必须使用其完整路径,否则会出现错误
*/

// 填充产品编号
label = new Label(0, j, strStockHId);
sheet.addCell(label);
label = new Label(1, j, strStockDId);
sheet.addCell(label);
label = new Label(2, j, strMaterialId);
sheet.addCell(label);
label = new Label(3, j, strMaterialDesc);
sheet.addCell(label);
label = new Label(4, j, strMaterialSpec);
sheet.addCell(label);
jxl.write.Number numbQTY = new jxl.write.Number(5, j, dQTY);
sheet.addCell(numbQTY);
jxl.write.Number numbPrice = new jxl.write.Number(6, j, dPrice);
sheet.addCell(numbPrice);
jxl.write.Number numbOther = new jxl.write.Number(7, j, dOther);
sheet.addCell(numbOther);
}
}
wwb.write();// 写入数据
wwb.close();// 关闭文件
os.close();
long end = System.currentTimeMillis();

} catch (Exception e) {
System.out.println("---出现异常---");
e.printStackTrace();
}
}
}

代码中的行得不到控制,只能写死!

3 楼 小白·菜 2008-03-27 回复
向同一个文件写入新的信息,当然覆盖。要么新建一个sheet,要么新建一个文件。

2 楼 jonakang 2008-03-26 回复
文件名另外起一个

1 楼 julycn 2007-11-29 回复
利用上面的例子,导出的excel有问题,第一次导出正常,第二次导出的记录是覆盖第一次的记录,不知道什么原因
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: