当前位置: 代码迷 >> 综合 >> Workbook
  详细解决方案

Workbook

热度:84   发布时间:2023-12-21 20:23:20.0

工作需要。话不多说。

我们来看传统的poi。使用HSSFWorkbook创建2003格式为xls后缀的文档。如下:

[html] view plain copy
  1. public String toTotal() {  
  2.         String strs = "'40288b163a72fd15013a730d44430004','40288b163a72fd15013a730d44430004'," + "'40288b163a72fd15013a730d44430004','40288b163a72fd15013a730d44430004',"  
  3.                 + "'40288b163a72fd15013a730d44430004','40288b163a72fd15013a730d44430004'," + "'40288b163a72fd15013a730d44430004','40288b163a72fd15013a730d44430004',"  
  4.                 + "'40288b163a72fd15013a730d44430004','40288b163a72fd15013a730d44430004'";  
  5.         String sql1 = "select id,question_note,item1,item2,item3,item4,item5,item6,item7,item8" + ",item9,item10,item11 from PR_VOTE_QUESTION where FK_VOTE_PAPER_ID in (" + strs + ")";  
  6.         String s1 = "SELECT DISTINCT ip from pr_vote_ANSWER where questionid=";  
  7.         dbpool db = new dbpool();  
  8.         MyResultSet m1 = null;  
  9.         MyResultSet y1 = null;  
  10.         MyResultSet x1 = null;  
  11.         try {  
  12.             m1 = db.executeQuery(sql1);  
  13.             HSSFWorkbook wb = new HSSFWorkbook();// 建立新HSSFWorkbook对象  
  14.             HSSFSheet sheet = wb.createSheet("total");// 建立新的sheet对象  
  15.             // HSSFCellStyle cellStyle = wb.createCellStyle();//建立新的cell样式---日期用  
  16.             // cellStyle.setDataFormat(HSSFDataFormat.getFormat("m/d/yy  
  17.             // h:mm"));//设置cell样式为定制的日期格式  
  18.             // HSSFCell dCell =row.createCell((short)4);  
  19.             // dCell.setCellvalue(new Date());//设置cell为日期类型的值  
  20.             // dCell.setCellStyle(cellStyle); //设置该cell日期的显示格式  
  21.             HSSFRow row = sheet.createRow(0);  
  22.             setCellGBKValue(row.createCell((short) 0), "用户IP");  
  23.             setCellGBKValue(row.createCell((short) 1), "题目");  
  24.             setCellGBKValue(row.createCell((short) 2), "选项");  
  25.             // 四个参数分别是:起始行,起始列,结束行,结束列  
  26.             sheet.addMergedRegion(new Region(0, (short) 2, 0, (short) 13));  
  27.             int i = 1;  
  28.             while (m1.next()) {  
  29.                 String id = m1.getString("id");  
  30.                 String question_note = m1.getString("question_note");  
  31.                 question_note = question_note.replace("<p>", "").replace("</p>", "").replace(" ", "").replace("<br />", "");  
  32.                 System.out.println("题目:" + question_note);  
  33.                 HSSFRow row2 = sheet.createRow((short) i);// 建立新行  
  34.                 HSSFCell cell = row2.createCell((short) 1);// 建立新cell  
  35.                 setCellGBKValue(cell, question_note);// 设置cell的整数类型的值  
  36.                 // HSSFRow row1 = sheet.createRow(++i);  
  37.                 // setCellGBKValue(row2.createCell((short) 1),"");  
  38.                 setCellGBKValue(row2.createCell((short) 2), m1.getString("item1"));  
  39.                 setCellGBKValue(row2.createCell((short) 3), m1.getString("item2"));  
  40.                 setCellGBKValue(row2.createCell((short) 4), m1.getString("item3"));  
  41.                 setCellGBKValue(row2.createCell((short) 5), m1.getString("item4"));  
  42.                 setCellGBKValue(row2.createCell((short) 6), m1.getString("item5"));  
  43.                 setCellGBKValue(row2.createCell((short) 7), m1.getString("item6"));  
  44.                 setCellGBKValue(row2.createCell((short) 8), m1.getString("item7"));  
  45.                 setCellGBKValue(row2.createCell((short) 9), m1.getString("item8"));  
  46.                 setCellGBKValue(row2.createCell((short) 10), m1.getString("item9"));  
  47.                 setCellGBKValue(row2.createCell((short) 11), m1.getString("item10"));  
  48.                 setCellGBKValue(row2.createCell((short) 12), m1.getString("item11"));  
  49.                 y1 = db.executeQuery(s1 + "'" + id + "'");  
  50.                 while (y1.next()) {  
  51.                     String str = "select a.ANSWERID ans,case when a.ANSWERID='1' then Q1.item1 " + " when a.ANSWERID='2' then Q1.item2 when a.ANSWERID='3' then Q1.item3 "  
  52.                             + " when a.ANSWERID='4' then Q1.item4 when a.ANSWERID='5' then Q1.item5 " + " when a.ANSWERID='6' then Q1.item6 when a.ANSWERID='7' then Q1.item7 "  
  53.                             + " when a.ANSWERID='8' then Q1.item8 when a.ANSWERID='9' then Q1.item9 " + " when a.ANSWERID='10' then Q1.item10 when a.ANSWERID='11' then Q1.item11 "  
  54.                             + " end usr_get from pr_vote_ANSWER a " + "INNER JOIN  PR_VOTE_QUESTION q1 on q1.id=a.questionid ";  
  55.                     String ip = y1.getString("ip");  
  56.                     System.out.println("用户ip:" + ip);  
  57.                     HSSFRow row3 = sheet.createRow((short) ++i);// 建立新行  
  58.                     HSSFCell cell3 = row3.createCell((short) 0);// 建立新cell  
  59.                     setCellGBKValue(cell3, ip);// 设置cell的整数类型的值  
  60.                     str += " where questionid='" + id + "' and ip='" + ip + "'";  
  61.                     x1 = db.executeQuery(str);  
  62.                     while (x1.next()) {  
  63.                         int ans = Integer.valueOf(x1.getString("ans"));  
  64.                         System.out.println("用户选项:" + ans);  
  65.                         HSSFCell cell4 = row3.createCell((short) (ans + 1));// 建立新cell  
  66.                         setCellGBKValue(cell4, x1.getString("usr_get"));// 设置cell的值  
  67.                     }  
  68.                     db.close(x1);  
  69.                 }  
  70.                 db.close(y1);  
  71.                 i++;  
  72.             }  
  73.             db.close(m1);  
  74.             FileOutputStream fileOut = new FileOutputStream("E:\\调查问卷-统计信息.xls");  
  75.             wb.write(fileOut);  
  76.             fileOut.close();  
  77.   
  78.         } catch (SQLException e) {  
  79.             e.printStackTrace();  
  80.             if (db != null && x1 != null) {  
  81.                 db.close(x1);  
  82.             }  
  83.             if (db != null && y1 != null) {  
  84.                 db.close(y1);  
  85.             }  
  86.             if (db != null && m1 != null) {  
  87.                 db.close(m1);  
  88.             }  
  89.         } catch (FileNotFoundException e) {  
  90.             e.printStackTrace();  
  91.         } catch (IOException e) {  
  92.             e.printStackTrace();  
  93.         } finally {  
  94.             if (db != null && x1 != null) {  
  95.                 db.close(x1);  
  96.             }  
  97.             if (db != null && y1 != null) {  
  98.                 db.close(y1);  
  99.             }  
  100.             if (db != null && m1 != null) {  
  101.                 db.close(m1);  
  102.             }  
  103.         }  
  104.         return null;  
  105.     }  


类似的创建2007以及版本的xlsx则为XSSFWorkbook。

当然除此之外,我们可以有其它的选择。使用SXSSFWorkbook。目前我只知道poi3.8以上版本有这个玩意。其它没试过。

下载下来后,你可以看有关它的记录。用来输出W级别以上的sql是个不错的选择。数据保存在内存中,它可以及时输出缓冲数据,指定内存中可以放入的数据,超过这个数据我们就进行输出。

[java] view plain copy
  1. //导出每个IP用户的调查问卷 lizhuang  
  2.     public String toDo() {  
  3.         String strs = "'40288b163a72fd15013a730d44430004','40288b163a72fd15013a730d44430004'," + "'40288b163a72fd15013a730d44430004','40288b163a72fd15013a730d44430004',"  
  4.                 + "'40288b163a72fd15013a730d44430004','40288b163a72fd15013a730d44430004'," + "'40288b163a72fd15013a730d44430004','40288b163a72fd15013a730d44430004',"  
  5.                 + "'40288b163a72fd15013a730d44430004','40288b163a72fd15013a730d44430004'";  
  6.         String sql1 = "select id,question_note,item1,item2,item3,item4,item5,item6,item7,item8" + ",item9,item10,item11 from PR_VOTE_QUESTION where FK_VOTE_PAPER_ID in (" + strs + ")";  
  7.         String s1 = "SELECT DISTINCT ip from pr_vote_ANSWER where questionid=";  
  8.         dbpool db = new dbpool();  
  9.         MyResultSet m1 = null;  
  10.         MyResultSet y1 = null;  
  11.         MyResultSet x1 = null;  
  12.         Map<String, Row> ips = new HashMap<String, Row>();//string对应用户IP,row存储用户所在的行。购物车原型【存储用户ID和商品】  
  13.         BufferedInputStream bis = null;  
  14.         BufferedOutputStream bos = null;  
  15.         try {  
  16.             m1 = db.executeQuery(sql1);  
  17.             SXSSFWorkbook wb = new SXSSFWorkbook(100);// 只在内存中保留100行数据,大数据时使用。兼容HSSFWorkbook2003和XSSFWorkbook2007  
  18.             wb.setCompressTempFiles(true); // temp files will be gzipped  
  19.             Sheet sheet = wb.createSheet("total");// 建立新的sheet对象  
  20.             sheet.setDefaultColumnWidth((short15);  
  21.             Row row = sheet.createRow(0);  
  22.             setCellGBKValue(row.createCell((short0), "用户IP");  
  23.             // 合并单元格四个参数分别是:起始行,起始列,结束行,结束列  
  24.             // sheet.addMergedRegion(new Region(0,(short)2,0,(short)13));  
  25.             int j = 1;//列的坐标,递增  
  26.             int k=1;//每个用户一行数据  
  27.             int cols = 2;// 默认4列  
  28.             while (m1.next()) {  
  29.                 String id = m1.getString("id");  
  30.                 //取标题  
  31.                 String question_note = m1.getString("question_note");  
  32.                 question_note = question_note.replace("<p>""").replace("</p>""").replace(" """).replace("<br />""");  
  33.                 setCellGBKValue(row.createCell((short) j++), "");  
  34.                 setCellGBKValue(row.createCell((short) j++), question_note);  
  35.                 //取出选项,最多11个,可扩展。  
  36.                 setCellGBKValue(row.createCell((short) j++), m1.getString("item1"));  
  37.                 setCellGBKValue(row.createCell((short) j++), m1.getString("item2"));  
  38.                 String item3 = m1.getString("item3");  
  39.                 String item4 = m1.getString("item4");  
  40.                 String item5 = m1.getString("item5");  
  41.                 String item6 = m1.getString("item6");  
  42.                 String item7 = m1.getString("item7");  
  43.                 String item8 = m1.getString("item8");  
  44.                 String item9 = m1.getString("item9");  
  45.                 String item10 = m1.getString("item10");  
  46.                 String item11 = m1.getString("item11");  
  47.                 if (item3 != null) {  
  48.                     cols = 3;  
  49.                     setCellGBKValue(row.createCell((short) j++), item3);  
  50.                 }  
  51.                 if (item4 != null) {  
  52.                     cols = 4;  
  53.                     setCellGBKValue(row.createCell((short) j++), item4);  
  54.                 }  
  55.                 if (item5 != null) {  
  56.                     cols = 5;  
  57.                     setCellGBKValue(row.createCell((short) j++), item5);  
  58.                 }  
  59.                 if (item6 != null) {  
  60.                     cols = 6;  
  61.                     setCellGBKValue(row.createCell((short) j++), item6);  
  62.                 }  
  63.                 if (item7 != null) {  
  64.                     cols = 7;  
  65.                     setCellGBKValue(row.createCell((short) j++), item7);  
  66.                 }  
  67.                 if (item8 != null) {  
  68.                     cols = 8;  
  69.                     setCellGBKValue(row.createCell((short) j++), item8);  
  70.                 }  
  71.                 if (item9 != null) {  
  72.                     cols = 9;  
  73.                     setCellGBKValue(row.createCell((short) j++), item9);  
  74.                 }  
  75.                 if (item10 != null) {  
  76.                     cols = 10;  
  77.                     setCellGBKValue(row.createCell((short) j++), item10);  
  78.                 }  
  79.                 if (item11 != null) {  
  80.                     cols = 11;  
  81.                     setCellGBKValue(row.createCell((short) j++), item11);  
  82.                 }  
  83.                 y1 = db.executeQuery(s1 + "'" + id + "'");  
  84.                 Row row3 = null;  
  85.                 while (y1.next()) {  
  86.                     String str = "select a.ANSWERID ans,case when a.ANSWERID='1' then Q1.item1 " + " when a.ANSWERID='2' then Q1.item2 when a.ANSWERID='3' then Q1.item3 "  
  87.                             + " when a.ANSWERID='4' then Q1.item4 when a.ANSWERID='5' then Q1.item5 " + " when a.ANSWERID='6' then Q1.item6 when a.ANSWERID='7' then Q1.item7 "  
  88.                             + " when a.ANSWERID='8' then Q1.item8 when a.ANSWERID='9' then Q1.item9 " + " when a.ANSWERID='10' then Q1.item10 when a.ANSWERID='11' then Q1.item11 "  
  89.                             + " end usr_get from pr_vote_ANSWER a " + "left JOIN  PR_VOTE_QUESTION q1 on q1.id=a.questionid ";  
  90.                     String ip = y1.getString("ip");  
  91.                     if (!ips.containsKey(ip)) {  
  92.                         row3 = sheet.createRow((short) k++);// 建立新行,每行存储用户IP和答案  
  93.                         ips.put(ip, row3);// 利用购物车原理,只不过购物车存储的是每件商品,这里记录上次的行。  
  94.                     } else {  
  95.                         row3 = ips.get(ip);// 如果有商品就取出商品,计算商品数量++,金额++,此处取出上次的行  
  96.                     }  
  97.                     setCellGBKValue(row3.createCell((short0), ip);// 设置IP  
  98.                     str += " where questionid='" + id + "' and ip='" + ip + "'";  
  99.                     x1 = db.executeQuery(str);  
  100.                     while (x1.next()) {  
  101.                         int ans = Integer.valueOf(x1.getString("ans"));  
  102.                         setCellGBKValue(row3.createCell((short) (j - 1 - cols + ans)), x1.getString("usr_get"));  
  103.                     }  
  104.                     db.close(x1);  
  105.                     str = null;// destroy this,collection rubbish  
  106.                 }  
  107.                 db.close(y1);  
  108.                 if (k % 100 == 0) {  
  109.                     ((SXSSFSheet) sheet).flushRows(100);// flushRows(0)  
  110.                 }  
  111.             }  
  112.             db.close(m1);  
  113.             ByteArrayOutputStream os = new ByteArrayOutputStream();  
  114.             wb.write(os);// 将excel写入流  
  115.             byte[] content = os.toByteArray();  
  116.             InputStream is = new ByteArrayInputStream(content);  
  117.             HttpServletResponse response = ServletActionContext.getResponse();  
  118.             response.reset();  
  119.             response.setContentType("application/vnd.ms-excel;charset=utf-8"); // msexcel  
  120.             response.setHeader("Content-Disposition""attachment;filename=" + new String("调查问卷-统计信息.xlsx".getBytes(), "iso-8859-1"));  
  121.             ServletOutputStream out = response.getOutputStream();  
  122.             bis = new BufferedInputStream(is);  
  123.             bos = new BufferedOutputStream(out);  
  124.             byte[] buff = new byte[2048];  
  125.             int bytesRead;  
  126.             // Simple read/write loop.  
  127.             while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {  
  128.                 bos.write(buff, 0, bytesRead);  
  129.             }  
  130.             out.close();  
  131.             //直接写到本地,测试用  
  132.             //FileOutputStream fileOut = new FileOutputStream("E:\\调查问卷-统计信息.xlsx");  
  133.             //wb.write(fileOut);  
  134.             //fileOut.close();  
  135.         } catch (SQLException e) {  
  136.             e.printStackTrace();  
  137.         } catch (FileNotFoundException e) {  
  138.             e.printStackTrace();  
  139.         } catch (IOException e) {  
  140.             e.printStackTrace();  
  141.         } finally {  
  142.             if (db != null && x1 != null) {  
  143.                 db.close(x1);  
  144.             }  
  145.             if (db != null && y1 != null) {  
  146.                 db.close(y1);  
  147.             }  
  148.             if (db != null && m1 != null) {  
  149.                 db.close(m1);  
  150.             }  
  151.             try {  
  152.                 if (bis != null) {  
  153.                     bis.close();  
  154.                 }  
  155.                 if (bos != null) {  
  156.                     bos.close();  
  157.                 }  
  158.             } catch (IOException e) {  
  159.                 e.printStackTrace();  
  160.             }  
  161.         }  
  162.         return null;  
  163.     }  
  164.   
  165.     private static void setCellGBKValue(Cell cell, String value) {  
  166.         cell.setCellType(Cell.CELL_TYPE_STRING);// 设置CELL的编码信息  
  167.         cell.setCellValue(value);  
  168.     }  

这是依据poi的文档做出来的,相应的包路径:
[java] view plain copy
  1. import org.apache.poi.hssf.usermodel.HSSFCell;  
  2. import org.apache.poi.hssf.usermodel.HSSFRow;  
  3. import org.apache.poi.hssf.usermodel.HSSFSheet;  
  4. import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
  5. import org.apache.poi.hssf.util.Region;  
  6. import org.apache.poi.ss.usermodel.Cell;  
  7. import org.apache.poi.ss.usermodel.Row;  
  8. import org.apache.poi.ss.usermodel.Sheet;  
  9. import org.apache.poi.xssf.streaming.SXSSFSheet;  
  10. import org.apache.poi.xssf.streaming.SXSSFWorkbook;  
  11. import java.io.BufferedInputStream;  
  12. import java.io.BufferedOutputStream;  
  13. import java.io.ByteArrayInputStream;  
  14. import java.io.ByteArrayOutputStream;  
  15. import java.io.FileNotFoundException;  
  16. import java.io.FileOutputStream;  
  17. import java.io.IOException;  
  18. import java.io.InputStream;  

打印后的效果为:


之所以使用2007,是因为它支持最大的列数为16000多列。而这正好符合我的需求。客户要求所有用户的回答在同一行显示。显然用2003是不够用的。2003最大才256列。

变态的需求产生这样的效果。

答案的定位显示我没有使用2维数组,因为2维数据需要循环。而我不喜欢在程序中太多的使用循环,此处使用购物车存入商品的原理实现了数据的定位。

算是一种学习吧。记录于此。