保存Apache POI Excel文档时复制单元格的值

我有一个奇怪的问题,想知道是否有其他人遇到过这个问题。 我有一个Java servlet正在做两个mySQL查询,然后使用查询返回的值创build一个Apache POI工作表。 第一个查询是总数,第二个查询是总数的一部分。 然后,我计算一个百分比,这只是部分/总数* 100。

出于testing目的,我返回一个XML结构来certificate这些值是我期待他们的。 xml结构具有正确的值。 我也从POI工作表中检索单元格值,然后input它们进行testing,并确保存储在工作表中的值是正确的。 他们也是。

问题是,一旦我将工作表写入到Excel文件中,表示总数的第一行中的单元格显示与表示该部分的第二行中的单元格相同的值。 代表百分比的第三行是1.第三个事实是最奇怪的,因为这意味着错误在百分比计算过程中发生,而不是在写入输出stream时发生。 就好像两个百分比的计算是同时进行的,一个是根据正确的总分(在xml中显示的),另一个是在零件本身之间进行分割,产生1(显示在输出的Excel表格中)。 有没有人有类似的问题?

我在servlet中包含了doPost代码下面:

public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { String outtype = ""; String query = ""; String querytot = ""; boolean bError = false; HttpSession session = req.getSession(true); StringBuffer sbResponse = new StringBuffer("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<response>\n"); ServletContext sc = getServletContext(); String sErrorMessage = ""; String sErrorCode = ""; StringBuffer dbStringBuf = new StringBuffer(""); outtype = getStringParameter(req, "outtype", "0"); querytot = getStringParameter(req, "querytot", "0"); query = getStringParameter(req, "query", "0"); try { Connection con = datasource.getConnection(); stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(querytot); //querying for the total value rs.next(); Object obj = rs.getObject(1); dbStringBuf.append(" <whole>\n"); //starting build of xml structure for testing here Integer currRowintTot = 0; String currRowTot = obj.toString(); currRowintTot = Integer.parseInt(currRowTot); int tothold = currRowintTot; Workbook wb = new HSSFWorkbook(); Sheet sheet1 = wb.createSheet("mainsheet"); Row row = sheet1.createRow(1); Cell labelcell = row.createCell(0); Cell valuecell = row.createCell(1); labelcell.setCellValue("Survey Val Whole"); valuecell.setCellValue(currRowTot); dbStringBuf.append(" <result>"+currRowTotConv+"</result>\n"); dbStringBuf.append(" </whole>\n"); stmt.close(); stmt2 = con.createStatement(); ResultSet rspart = stmt2.executeQuery(query); //querying for the part value rspart.next(); Object objpart = rspart.getObject(1); String currRowPart = objpart.toString(); dbStringBuf.append(" <part>\n"); currRowintPart = Integer.parseInt(currRowPart); int parthold = currRowintPart; dbStringBuf.append(" <result>"+currRowPart+"</result>\n"); Row row2 = sheet1.createRow(2); Cell labelcellw = row2.createCell(0); Cell valuecellw = row2.createCell(1); labelcellw.setCellValue("Survey Value Part"); valuecellw.setCellValue(currRowPart); dbStringBuf.append(" </part>\n"); dbStringBuf.append(" <pct>\n"); float partfl = (float)parthold; float wholefl = (float)tothold; Integer pctval = Math.round( (partfl/wholefl)*100 ); Row row3 = sheet1.createRow(3); Cell labelcellp = row3.createCell(0); Cell valuecellp = row3.createCell(1); labelcellp.setCellValue("Survey Value Pct"); valuecellp.setCellValue(pctval); dbStringBuf.append(" <result>"+pctval+"</result>\n"); dbStringBuf.append(" </pct>\n"); stmt2.close(); con.close(); FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator(); //checking to make sure value entered in cell is what I'm expecting CellReference cellReference = new CellReference("B2"); Row rowtest = sheet1.getRow(cellReference.getRow()); Cell celltest = rowtest.getCell(cellReference.getCol()); if (celltest!=null) { dbStringBuf.append(" <test>\n"); dbStringBuf.append(" <result>celltest not null/result>\n"); dbStringBuf.append(" </test>\n"); dbStringBuf.append(" <test>\n"); dbStringBuf.append(" <result>"+celltest.getStringCellValue()+"</result>\n"); dbStringBuf.append(" </test>\n"); } else{ dbStringBuf.append(" <test>\n"); dbStringBuf.append(" <result>sorry, null</result>\n"); dbStringBuf.append(" </test>\n"); } if(outtype.equals("excel")){ //flag from client page determines that we should export Excel file res.setContentType("application/ms-excel"); res.setHeader("Expires:", "0"); // eliminates browser caching res.setHeader("Content-Disposition", "attachment; filename=testxls.xls"); OutputStream outStream = res.getOutputStream(); wb.write(outStream); outStream.close(); } } catch(SQLException e) { bError = true; sErrorMessage = "SQLException " + e.getMessage()+" data:"+datatracker+" context:"+contexttracker; sErrorCode = "102"; } finally { if (bError) { sbResponse.append(" ");appendTag("status","ERROR",sbResponse);sbResponse.append("\n"); sbResponse.append(" ");appendTag("errorCode",sErrorCode,sbResponse);sbResponse.append("\n"); sbResponse.append(" ");appendTag("message",sErrorMessage,sbResponse);sbResponse.append("\n"); } else { sbResponse.append(" "); appendTag("status","OK",sbResponse); sbResponse.append("\n"); sbResponse.append( dbStringBuf ); } } if(outtype.equals("xml")){ //flag from client page determines that we should return xml res.setContentType("text/plain"); // CHANGE BACK TO text/xml out= res.getWriter(); sbResponse.append("</response>"); out.println( sbResponse.toString() ); } }