最近写了一个,Excel 的 写入和导出. 需求是这样的. 在新建合同的时候,会有导出合同的数据, 导出的模板是固定的,,需要在模板里面写入合同的信息.
first : 下载模板 > 写入数据 > 输出
下载模板 :
StringBuilder path = new StringBuilder(""); path.append(request.getSession().getServletContext().getRealPath("")); path.append(File.separator); path.append("WEB-INF"); path.append(File.separator); path.append("classes"); path.append(File.separator); path.append("template"); path.append(File.separator); String filePath=path.toString()+"\"+"contractDemo.xlsx"; //这是获取jboss服务器上的模板路径
FileInputStream fis = new FileInputStream(filePath); XSSFWorkbook workBook=new XSSFWorkbook(fis); // 新建一个workBook 用来新建Excel 的sheet
// 这个是下载和输出excel excel写入数据 是在另一个方法里面写着的 ,方法分开来写比较清晰.
try{
StringBuilder path = new StringBuilder(""); path.append(request.getSession().getServletContext().getRealPath("")); path.append(File.separator); path.append("WEB-INF"); path.append(File.separator); path.append("classes"); path.append(File.separator); path.append("template"); path.append(File.separator); String filePath=path.toString()+"\"+"contractDemo.xlsx"; // 服务器上的模板路径 FileInputStream fis = new FileInputStream(filePath); // 输入流 XSSFWorkbook workBook=new XSSFWorkbook(fis); String fileName="test_"+System.currentTimeMillis()+".xlsx"; OutputStream out=new FileOutputStream("d:/"+fileName); contractExportTemplate.createSheet(workBook,vo,conf); workBook.setForceFormulaRecalculation(true); workBook.write(out); fis.close(); out.flush(); out.close(); return "success"; }catch(Exception e){ e.printStackTrace(); return "error"; }
// 下面的代码其实就是在excel 里面写入数据,我是根据模板来写的,所以sheet 表里面的格式都是固定的.我只要获取具体的单元格然后写入数据就可以了.
//给excel表添加数据 public void excelContractWriteData(XSSFWorkbook workBook,XSSFSheet sheet, List<ContractExcelGroupByStoreVo> conList1, List<ContractExcelGroupByAreaVo> conList2,List<ContractExcelGroupByStoreVo> conList3) throws Exception{ if(conList1.size()!=0){ XSSFRow row0=sheet.getRow(0); row0.getCell(2).setCellValue(conList1.get(0).getTaskId()+""+ (conList1.get(0).getPrintSeqNo()==null?"1":conList1.get(0).getPrintSeqNo()));//写入打印编号 XSSFRow row=sheet.getRow(2); //获取sheet表的单元格,写入数据 row.getCell(2).setCellValue(conList1.get(0).getYear()); row.getCell(4).setCellValue(conList1.get(0).getCatlgId()); row.getCell(6).setCellValue(conList1.get(0).getSupNo()); } if(conList2.size()!=0){ for( ContractExcelGroupByAreaVo vo :conList2){ if(vo.getAreaName()!="" && "华东".equals(vo.getAreaName().toString())) { sheet.getRow(6).getCell(2).setCellValue(vo.getStoreNum()); sheet.getRow(6).getCell(3).setCellValue(vo.getTargetNum()); } if(vo.getAreaName()!="" && "西南".equals(vo.getAreaName().toString())) { sheet.getRow(7).getCell(2).setCellValue(vo.getStoreNum()); sheet.getRow(7).getCell(3).setCellValue(vo.getTargetNum()); } if(vo.getAreaName()!="" && "华北".equals(vo.getAreaName().toString())) { sheet.getRow(8).getCell(2).setCellValue(vo.getStoreNum()); sheet.getRow(8).getCell(3).setCellValue(vo.getTargetNum()); } if(vo.getAreaName()!="" && "华南".equals(vo.getAreaName().toString())) { sheet.getRow(9).getCell(2).setCellValue(vo.getStoreNum()); sheet.getRow(9).getCell(3).setCellValue(vo.getTargetNum()); } if(vo.getAreaName()!="" && "华中".equals(vo.getAreaName().toString())) { sheet.getRow(10).getCell(2).setCellValue(vo.getStoreNum()); sheet.getRow(10).getCell(3).setCellValue(vo.getTargetNum()); } } } if(conList3.size()!=0){ int rowIndex=14; //这个数字是根据excel模板定的 for(ContractExcelGroupByStoreVo conExcel : conList3){ sheet.getRow(rowIndex).getCell(1).setCellValue(conExcel.getAreaName()); sheet.getRow(rowIndex).getCell(2).setCellValue(conExcel.getProvinceName()); sheet.getRow(rowIndex).getCell(3).setCellValue(conExcel.getCityName()); sheet.getRow(rowIndex).getCell(4).setCellValue(conExcel.getStoreNum()+"-"+conExcel.getStoreName()); //门店的编号 sheet.getRow(rowIndex).getCell(5).setCellValue(conExcel.getStoreAmount()); sheet.getRow(rowIndex).getCell(6).setCellValue(conExcel.getMemo()); if(conExcel.getServReqd()!=null){ String month= conExcel.getServReqd().toString(); sheet.getRow(rowIndex).getCell(7).setCellValue(this.stringtoIntArray(month)); }else{ sheet.getRow(rowIndex).getCell(7).setCellValue(conExcel.getDateStr()); } rowIndex++; } } }
// 这里是一个排序, 月份有 1 2 3 4 5 6 7 8 9 10 11 12 但是每次出现的月份是不固定的 可能中间会有断开的月份. 所以需要先排序然后 判断 第二个数和第一个数相差多少, 如果相差大于2的话就说明 月份中间是有断开的.那就把连续的几个数的头尾 用字符串拼接起来,显示
//把 月份数组转换为字符串 public String stringtoIntArray(String str) { StringBuffer dateStage= new StringBuffer(""); String strs[] = str.split(","); int array[] = new int[strs.length]; for(int i=0;i<strs.length;i++){ array[i]=Integer.parseInt(strs[i]); } for (int i = 0; i < array.length; i++) { for(int j = 0; j<array.length-i-1; j++){ if(array[j]>array[j+1]){ int temp = array[j]; array[j] = array[j+1]; array[j+1] = temp; } } } int a=array[0]; for (int j = 1; j < array.length; j++) { if(array[j] - array[j-1]>=2){ dateStage.append(""+a+"-"+array[j-1]+","); a=array[j]; } if(j==(array.length-1)){ dateStage.append(""+a+"-"+array[j]); } } return dateStage.toString(); }