用POI把数据导出为Excel

(一)SheetDataSource.java

代码
  1. package com.javaeye.yongsky;
  2. import java.sql.*;
  3. import java.util.*;
  4. import com.microsoft.jdbc.*;
  5. public class SheetDataSource {
  6. private static Connection con ;
  7. private static final String DatabaseName = "POIDEMO";
  8. private static final String userName = "sa";
  9. private static final String password = "123";
  10. public SheetDataSource()
  11. {
  12. try {
  13. Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
  14. try {
  15. con = DriverManager.getConnection("jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName="+DatabaseName,userName,password);
  16. } catch (SQLException e) {
  17. e.printStackTrace();
  18. }
  19. } catch (ClassNotFoundException e) {
  20. e.printStackTrace();
  21. }
  22. }
  23. public static ResultSet selectAllDataFromDB() throws SQLException
  24. {
  25. new SheetDataSource();
  26. Statement stmt = con.createStatement();
  27. return stmt.executeQuery("select * from COMPANY");
  28. }
  29. }
<script type="text/javascript">render_code();</script>

上面部分代码主要是从数据库里面取出数据,作为Excel的数据源.

(二)PoiDemo.java

代码
  1. package com.javaeye.yongsky;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. import java.io.OutputStream;
  5. import java.sql.ResultSet;
  6. import java.sql.SQLException;
  7. import java.util.*;
  8. import javax.swing.JOptionPane;
  9. import org.apache.poi.hssf.usermodel.HSSFCell;
  10. import org.apache.poi.hssf.usermodel.HSSFFooter;
  11. import org.apache.poi.hssf.usermodel.HSSFHeader;
  12. import org.apache.poi.hssf.usermodel.HSSFRow;
  13. import org.apache.poi.hssf.usermodel.HSSFSheet;
  14. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  15. public class PoiDemo {
  16. //表头
  17. public static final String[] tableHeader = {"企业中文名","所属国家","企业英文名","2003年排名","2004年排名","2005年排名",
  18. "2006年排名","2007年排名","主要业务","2003年营业额","2004年营业额","2005年营业额","2006年营业额","2007年营业额","企业编号","名次升降",
  19. "图片","状况"};
  20. //创建工作本
  21. public static HSSFWorkbook demoWorkBook = new HSSFWorkbook();
  22. //创建表
  23. public static HSSFSheet demoSheet = demoWorkBook.createSheet("The World's 500 Enterprises");
  24. //表头的单元格个数目
  25. public static final short cellNumber = (short)tableHeader.length;
  26. //数据库表的列数
  27. public static final int columNumber = 18;
  28. /**
  29. * 创建表头
  30. * @return
  31. */
  32. public static void createTableHeader()
  33. {
  34. HSSFHeader header = demoSheet.getHeader();
  35. header.setCenter("世界五百强企业名次表");
  36. HSSFRow headerRow = demoSheet.createRow((short) 0);
  37. for(int i = 0;i < cellNumber;i++)
  38. {
  39. HSSFCell headerCell = headerRow.createCell((short) i);
  40. headerCell.setEncoding(HSSFCell.ENCODING_UTF_16);
  41. headerCell.setCellValue(tableHeader[i]);
  42. }
  43. }
  44. /**
  45. * 创建行
  46. * @param cells
  47. * @param rowIndex
  48. */
  49. public static void createTableRow(List<string> cells,</string>short rowIndex)
  50. {
  51. //创建第rowIndex行
  52. HSSFRow row = demoSheet.createRow((short) rowIndex);
  53. for(short i = 0;i < cells.size();i++)
  54. {
  55. //创建第i个单元格
  56. HSSFCell cell = row.createCell((short) i);
  57. cell.setEncoding(HSSFCell.ENCODING_UTF_16);
  58. cell.setCellValue(cells.get(i));
  59. }
  60. }
  61. /**
  62. * 创建整个Excel表
  63. * @throws SQLException
  64. *
  65. */
  66. public static void createExcelSheeet() throws SQLException
  67. {
  68. createTableHeader();
  69. ResultSet rs = SheetDataSource.selectAllDataFromDB();
  70. int rowIndex = 1;
  71. while(rs.next())
  72. {
  73. List<string> list = new ArrayList<string>(); </string></string>
  74. for(int i = 1;i <= columNumber;i++)
  75. {
  76. list.add(rs.getString(i));
  77. }
  78. createTableRow(list,(short)rowIndex);
  79. rowIndex++;
  80. }
  81. }
  82. /**
  83. * 导出表格
  84. * @param sheet
  85. * @param os
  86. * @throws IOException
  87. */
  88. public void exportExcel(HSSFSheet sheet,OutputStream os) throws IOException
  89. {
  90. sheet.setGridsPrinted(true);
  91. HSSFFooter footer = sheet.getFooter();
  92. footer.setRight("Page " + HSSFFooter.page() + " of " +
  93. HSSFFooter.numPages());
  94. demoWorkBook.write(os);
  95. }
  96. public static void main(String[] args) {
  97. String fileName = "D://世界五百强企业名次表.xls";
  98. FileOutputStream fos = null;
  99. try {
  100. PoiDemo pd = new PoiDemo();
  101. pd.createExcelSheeet();
  102. fos = new FileOutputStream(fileName);
  103. pd.exportExcel(demoSheet,fos);
  104. JOptionPane.showMessageDialog(null, "表格已成功导出到 : "+fileName);
  105. } catch (Exception e) {
  106. JOptionPane.showMessageDialog(null, "表格导出出错,错误信息 :"+e+"/n错误原因可能是表格已经打开。");
  107. e.printStackTrace();
  108. } finally {
  109. try {
  110. fos.close();
  111. } catch (Exception e) {
  112. e.printStackTrace();
  113. }
  114. }
  115. }
  116. }
评论
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代码 复制代码
  1. public static void getXLSData(List list,String[] aTitle,OutputStream os) {   
  2.   
  3.         // 准备设置excel工作表的标题   
  4.         try {   
  5.             // 获得开始时间   
  6.             long start = System.currentTimeMillis();   
  7.             // 创建Excel工作薄   
  8.             WritableWorkbook wwb;   
  9.             // 新建立一个jxl文件,即在C盘下生成test.xls   
  10. //          OutputStream os = new FileOutputStream(filePath);   
  11.             wwb = Workbook.createWorkbook(os);   
  12.             // 添加第一个工作表并设置第一个Sheet的名字   
  13.             WritableSheet sheet = wwb.createSheet("零售商库存//促销准备库存//五天质询表身"0);   
  14.             Label label;   
  15.             for (int i = 0; i < aTitle.length; i++) {   
  16.                 // Label(x,y,z)其中x代表单元格的第x+1列,第y+1行, 单元格的内容是y   
  17.                 // 在Label对象的子对象中指明单元格的位置和内容   
  18.                 label = new Label(i, 0, aTitle[i]);   
  19.                 // 将定义好的单元格添加到工作表中   
  20.                 sheet.addCell(label);   
  21.             }   
  22.             SMSStockDVO objSMSStockDVO = null;   
  23.             Iterator iter = list.iterator();   
  24.             while (iter.hasNext()) {   
  25.                 for (int j = 1; j <= list.size(); j++) {   
  26.                     //遍历 SMSTerminalPromoInfoVO中所有的值   
  27.                     objSMSStockDVO = (SMSStockDVO) iter.next();   
  28.                     String strStockHId = objSMSStockDVO.getStockHId();   
  29.                     String strStockDId = objSMSStockDVO.getStockDId();   
  30.                     String strMaterialId = objSMSStockDVO.getMaterialId();   
  31.                     String strMaterialDesc = objSMSStockDVO.getMaterialDesc();   
  32.                     String strMaterialSpec = objSMSStockDVO.getMaterialSpec();   
  33.                     double dQTY = objSMSStockDVO.getDoubleQty();   
  34.                     double dPrice = objSMSStockDVO.getDoublePrice();   
  35.                     double dOther =objSMSStockDVO.getDoubleOther();   
  36.                     // 下面是填充数据   
  37.                     /*  
  38.                      * 保存数字到单元格,需要使用jxl.write.Number 必须使用其完整路径,否则会出现错误  
  39.                      */  
  40.   
  41.                     // 填充产品编号   
  42.                     label = new Label(0, j, strStockHId);   
  43.                     sheet.addCell(label);   
  44.                     label = new Label(1, j, strStockDId);   
  45.                     sheet.addCell(label);   
  46.                     label = new Label(2, j, strMaterialId);   
  47.                     sheet.addCell(label);   
  48.                     label = new Label(3, j, strMaterialDesc);   
  49.                     sheet.addCell(label);   
  50.                     label = new Label(4, j, strMaterialSpec);   
  51.                     sheet.addCell(label);   
  52.                     jxl.write.Number numbQTY = new jxl.write.Number(5, j, dQTY);   
  53.                     sheet.addCell(numbQTY);   
  54.                     jxl.write.Number numbPrice = new jxl.write.Number(6, j, dPrice);   
  55.                     sheet.addCell(numbPrice);   
  56.                     jxl.write.Number numbOther = new jxl.write.Number(7, j, dOther);   
  57.                     sheet.addCell(numbOther);   
  58.                 }   
  59.             }    
  60.             wwb.write();// 写入数据   
  61.             wwb.close();// 关闭文件   
  62.             os.close();   
  63.             long end = System.currentTimeMillis();    
  64.   
  65.         } catch (Exception e) {   
  66.             System.out.println("---出现异常---");   
  67.             e.printStackTrace();   
  68.         }   
  69.     }   
  70. }  
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有问题,第一次导出正常,第二次导出的记录是覆盖第一次的记录,不知道什么原因
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值