2007-08-01
用POI把数据导出为Excel
关键字: poi excel java(一)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");
- }
- }
上面部分代码主要是从数据库里面取出数据,作为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
cells, 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
list = new ArrayList (); - 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();
- }
- }
- }
- }
评论
westlee
2008-06-29
回答hdljavaeye 问题,这是我的小小经验,有可能不对,但请大学改正。
第一个问题回答:POI中可以取多种数据类型,如日期,浮点等,只不过是字符是最好操作的,取值也是通过getXXX来得到。
第二个问题回答:在POI中如果是要向填充数据而不是读,最好的办法是先创建一行,再创建列,有多少列则需创建多少列,不过要注意字符的编码问题。其实就是一个道理先创建后操作。
上边就是我的一点理解。
第一个问题回答:POI中可以取多种数据类型,如日期,浮点等,只不过是字符是最好操作的,取值也是通过getXXX来得到。
第二个问题回答:在POI中如果是要向填充数据而不是读,最好的办法是先创建一行,再创建列,有多少列则需创建多少列,不过要注意字符的编码问题。其实就是一个道理先创建后操作。
上边就是我的一点理解。
hdljavaeye
2008-06-28
看过你的DEMO后,有几个问题想请教一下!
一 你所写的程序中,在获取rs的值时,怎么判断数据库中的字段类型?只能取单一类型的吗?不过,在jxl包中有几种类型可以选择:label,number.......POI中怎么实现!
二 POI中控制行的输出比较容易,可是控制列呢?比如说你的那个tableHeader是个动态的String 数组呢,怎么能够控制列的输出!不过在jxl包中也没发现这个功能!
贴出一段代码:
一 你所写的程序中,在获取rs的值时,怎么判断数据库中的字段类型?只能取单一类型的吗?不过,在jxl包中有几种类型可以选择:label,number.......POI中怎么实现!
二 POI中控制行的输出比较容易,可是控制列呢?比如说你的那个tableHeader是个动态的String 数组呢,怎么能够控制列的输出!不过在jxl包中也没发现这个功能!
贴出一段代码:
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();
}
}
}
代码中的行得不到控制,只能写死!
小白·菜
2008-03-27
向同一个文件写入新的信息,当然覆盖。要么新建一个sheet,要么新建一个文件。
spyker
2008-03-26
我觉的第二次记录覆盖第一次记录才是正常的
jonakang
2008-03-26
文件名另外起一个
julycn
2007-11-29
利用上面的例子,导出的excel有问题,第一次导出正常,第二次导出的记录是覆盖第一次的记录,不知道什么原因
- 浏览: 56328 次
- 性别:

- 来自: 上海

- 详细资料
搜索本博客
我的相册
seam.jpg
共 13 张
共 13 张
最近加入圈子
最新评论
-
Gwt-Ext学习笔记之基础篇
问题已经解决
-- by chinahcl -
Gwt-Ext学习笔记之基础篇
[ERROR] Unable to find 'com/google/gwt/u ...
-- by chinahcl -
Gwt-Ext学习笔记之基础篇
谢谢楼主,楼主厉害
-- by chinahcl -
Seam实例教程(环境配置)
不好意思,为什么照你这样做的,但是会报错, 10:30:39,562 INFO ...
-- by yuyanshan -
Seam实例教程(环境配置)
总算自己弄明白了
-- by afadgaeg






评论排行榜