用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();
}
}
}
代码中的行得不到控制,只能写死!
3 楼 小白·菜 2008-03-27 回复
向同一个文件写入新的信息,当然覆盖。要么新建一个sheet,要么新建一个文件。
2 楼 jonakang 2008-03-26 回复
文件名另外起一个
1 楼 julycn 2007-11-29 回复
利用上面的例子,导出的excel有问题,第一次导出正常,第二次导出的记录是覆盖第一次的记录,不知道什么原因
代码
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有问题,第一次导出正常,第二次导出的记录是覆盖第一次的记录,不知道什么原因
相关文章推荐
- 使用JDBC+POI把Excel中的数据导出到MySQL
- struts2中使用poi导出excel数据
- 使用poi导出大量数据到excel遇到的问题
- POI导出大量数据的简单解决方案(附源码)-Java-POI导出大量数据,导出Excel文件,压缩ZIP(转载自iteye.com)
- 用POI把数据导出为Excel
- java操作Excel之POI(5)利用POI实现使用模板批量导出数据
- 简单的POI导出JSP页面表格数据到excel
- java利用poi导出数据到excel里
- 使用poi通过excel模板导出excel数据
- java中使用poi导出excel表格数据并且可以手动修改导出路径
- 使用poi将jtable数据导出到excel中
- 利用POI将数据导出到EXCEL模板
- 使用poi实现导出excel数据表格
- Java程序员从笨鸟到菜鸟之(一百零五)java操作office和pdf文件(三)利用jxl实现数据导出excel报表以及与POI的区别
- Java使用POI实现数据导出excel报表
- JAVA使用poi进行EXCEL模板导入导出,XSSFCell数据类型
- poi 导出大数据量数据到excel. 百万数据
- 解决POI大数据导出Excel内存溢出、应用假死
- java poi excel 导入导出数据
- POI : 解决大批量数据导出Excel产生内存溢出的方案