POI如何修改一个Excel的合并单元格的值(合并单元格原来有值的)?

POI如何修改一个Excel的合并单元格的值(合并单元格原来有值的)?

2个回答

合并单元格的值其实就是左上角那个单元格的值,直接读写它就可以了。

mmingxiang
mmingxiang 测试代码如下:
大约 4 年之前 回复
mmingxiang
mmingxiang 测试代码如下:
大约 4 年之前 回复
mmingxiang
mmingxiang 我自己测试过这种方法,当合并单元格里面原本没有值的时候写入没什么问题;当合并单元格里面有值的时候就无法修改写入新的值。
大约 4 年之前 回复

图片说明

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
poi如何判断excel单元格为合并单元格
今天在用poi读取excel表格的时候发现使用cell.getArrayFormulaRange()并不能返回这个单元格的边界。请问该如何判断单元格为合并单元格并获取合并单元格的行数列数
如何通过poi读取Excel中合并的单元格再以同样的样式写入另外一个Excel中?
现在有个需求就是通过解析一个Excel模板来生成Excel报表,取写数据不谈,但得保证的一个是生成的这个Excel报表与模板的样式肯定是一样的,这样就遇到个问题,比如报表的标题,通常都是几个单元格合并起来的,通过poi读取的时候,第一行只有第一列有数据,其他都为空(Excel本身就是这样的吧),那这样我如何取到模板的合并单元格的样式再写入另外的excel中呢?
poi解析excel首单元格合并取之后的单元格值怎么都为空
![![![图片说明](https://img-ask.csdn.net/upload/201705/26/1495779476_50232.png)图片说明](https://img-ask.csdn.net/upload/201705/26/1495779460_665198.png)图片说明](https://img-ask.csdn.net/upload/201705/26/1495779740_558722.png)
POI导出excel的单元格合并是假合并怎么解决??
![图片说明](https://img-ask.csdn.net/upload/201508/24/1440410782_188927.png) 如同代码合并了Excel也能看出合并了,但是为什么计数就是不是1呢?怎么解决???
POI获取excle合并单元格以及没有合并单元格的数据
问题描述:如果excle表里最后一行数据是没有合并的,就取不到值,如果最后一行是合并过的数据,就都能取得到了(合并未合并的都可以获取到)。有大神可以帮忙看一下代码解决一下吗,谢谢啦。 package service; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.HashSet; import java.util.Set; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import entity.Table; public class ExcelOp { public String excelPath; public ExcelOp(String excelPath) { this.excelPath = excelPath; } public String getExcelPath() { return excelPath; } public void setExcelPath(String excelPath) { this.excelPath = excelPath; } /** * * @param excelPath:excel路径 * @param args:需要操作的列 * @throws IOException */ @SuppressWarnings("resource") public ArrayList<Table> readExcel() throws IOException{ File excelFile = new File(excelPath); InputStream is = new FileInputStream(excelFile); // 获取文件输入流 ArrayList<Table> list = null; String suffix = excelPath.substring(excelPath.lastIndexOf(".")+1); if(suffix.equals("xls")){ HSSFWorkbook workbook = null; workbook = new HSSFWorkbook(is); if(workbook != null){ HSSFSheet sheet = workbook.getSheetAt(1);//获取第二张表 if(sheet == null){ System.out.println(); return null; } list = new ArrayList<Table>(); int combineLines = 1; int number = 1; //读取行 for (int rowNum = 3; rowNum < sheet.getLastRowNum(); rowNum+=combineLines) { HSSFRow row = sheet.getRow(rowNum); if (row == null) continue; Table tb = new Table(); tb.setNumber("3.1." + number); // tb.setTestData(row.getCell(0).toString()); tb.setTitle(row.getCell(1).toString()); //Word换行主要有两大类,一类是表格单元格文本的换行,另一类是表格之外的文本的换行。对于表格外的文本我们可以使用“\r”或者“(char)11”来换行,然而对于表格内的文本我们只能使用“(char)11”来进行换行操作。 // tb.setFunctionPoint(row.getCell(2).toString().replace('\n', (char)11)); tb.setFunctionPoint(row.getCell(2).toString()); combineLines = isMergedRegion(sheet, rowNum, 1); String process = ""; String conclusion = ""; Set<String> s = new HashSet<String>(); for (int i = rowNum; i< rowNum + combineLines; i++) { //步骤 HSSFRow r1 = sheet.getRow(i); // process += r1.getCell(5).toString() + (char)11 + (char)11; process += r1.getCell(5).toString() + "\n" + "\n"; //结果 String result = r1.getCell(7).toString(); s.add(result); } tb.setProcess(process); tb.setConclusion(conclusion); number++; list.add(tb); } } } return list; } //返回合并单元格占用行数 public int isMergedRegion(Sheet sheet, int row, int column) { int sheetMergeCount = sheet.getNumMergedRegions(); for (int i = 0; i < sheetMergeCount; i++) { CellRangeAddress range = sheet.getMergedRegion(i); int firstRow = range.getFirstRow(); int lastRow = range.getLastRow(); int firstColumn = range.getFirstColumn(); int lastColumn = range.getLastColumn(); if (row >= firstRow && row <= lastRow) { if(column >= firstColumn && column <= lastColumn){ return lastRow - firstRow + 1; } } } return 1; } }
poi3.8 操作excel2007合并单元格没效果
<p>/**定性清单表头 <br>  * @author 杨松涛<br>  */<br> private void dxqdHeadLine(Sheet sheet,XSSFWorkbook wb) {<br>  Row header = sheet.createRow(0);//第一行  <br>//  //第一行内容<br>  createCell(wb,header,0,"基础字段");createCell(wb,header,27,"回访环节情况");createCell(wb,header,32,"预处理情况");<br>  createCell(wb,header,40,"处理环节情况");createCell(wb,header,48,"定性审核环节");createCell(wb,header,56,"定性复核环节");<br>  createCell(wb,header,64,"分公司细化定责环节");createCell(wb,header,69,"原始服务产品类型");createCell(wb,header,71,"最终定性结果");<br>  createCell(wb,header,82,"客户属性");createCell(wb,header,89,"关联省公司考核班组");createCell(wb,header,90,"关联分公司考核班组");<br>  <br>  sheet.addMergedRegion(ExcelTool.getCellRangeAddress(0,0,0,26));<br>  sheet.addMergedRegion(ExcelTool.getCellRangeAddress(0,27,0,31));<br>  sheet.addMergedRegion(ExcelTool.getCellRangeAddress(0,32,0,39));<br>  sheet.addMergedRegion(ExcelTool.getCellRangeAddress(0,40,0,47));<br>  sheet.addMergedRegion(ExcelTool.getCellRangeAddress(0,48,0,55));<br>  sheet.addMergedRegion(ExcelTool.getCellRangeAddress(0,56,0,63));<br>  sheet.addMergedRegion(ExcelTool.getCellRangeAddress(0,64,0,68));<br>  sheet.addMergedRegion(ExcelTool.getCellRangeAddress(0,69,0,70));<br>  sheet.addMergedRegion(ExcelTool.getCellRangeAddress(0,71,0,81));<br>  sheet.addMergedRegion(ExcelTool.getCellRangeAddress(0,82,0,88));<br>  sheet.addMergedRegion(ExcelTool.getCellRangeAddress(0,89,1,89));<br>  sheet.addMergedRegion(ExcelTool.getCellRangeAddress(0,90,1,90));</p> <p> </p> <p>只有第一个,"基础字段"合并了有效果,其他后面的字段都没合并</p>
java poi 导出excel 把一样的数据动态合并单元格
急求,有一个list<map>数据 导出成![图片说明](https://img-ask.csdn.net/upload/201504/24/1429882933_758139.png) 这种格式 公司和年份两列是要有动态合并功能 并且年份合并的时候不能跨公司 有没有大神帮帮忙... ``` HSSFWorkbook workbook = new HSSFWorkbook(); String[] columnNames = new String[]{"编号","公司", "年份","性质", "名称","议案审核","召开时间","我方董监事","开展情况","决议"}; String[] columnKey = new String[]{"BIANHAO", "SGLWDW" ,"SGND","SGHYXZ","TITLENAME","BILLAUDIT","SGZKSJ","SGWFDS","DEVELOPMENT","DECISION"}; Map resMap = new HashMap(); try { if(list.size()==0){ resMap=new HashMap<String, String>(); resMap.put("tsBy1", "没有数据"); list.add(resMap); } HSSFSheet sheet = workbook.createSheet("sheet"+1); //首先,我们读取list中的第一个元素,根据它来确定工作表的列名,以及输出数据所对应的方法数组 Map<String,String> map2 = list.get(0); HSSFRow row = sheet.createRow(0); //创建第1行,也就是输出表头 HSSFCell cell; for(int i=0;i<columnNames.length;i++){ cell = row.createCell(i); //创建第i列 cell.setCellValue(new HSSFRichTextString(columnNames[i])); } //下面是输出各行的数据 for (int i = 0; i < list.size(); i++) { map2=(Map<String,String>)list.get(i); row=sheet.createRow(i+1);//创建第i+1行 for ( int j = 0; j < columnKey.length; j ++){ cell = row.createCell(j);//创建第j列 if(columnKey[j]==null || "".equals(columnKey[j])){ cell.setCellValue(i+1); }else{ Object obj = map2.get(columnKey[j]); cell.setCellValue(obj==null?"":obj.toString()); } } } row=sheet.createRow((short)(sheet.getLastRowNum()+1)); //在现有行号后追加数据 Region range = new Region(sheet.getLastRowNum(), (short)0, sheet.getLastRowNum(), (short)9); sheet.addMergedRegion(range); row.createCell(0).setCellValue(convoke+"家企业“已召开”,"+submit+"家企业议案“已提交”,"+archive+"家企业决议“已归档”,"+audit+"家企业议案“已审核”"); //设置第一个(从0开始)单元格的数据 OutputStream out = null; HttpServletResponse response = this.getResponse(); response.setContentType("octets/stream"); response.addHeader("Content-Disposition", "attachment;filename=_directorsDetail.xls"); try { out = response.getOutputStream(); workbook.write(out); out.close(); } catch (IOException e) { e.printStackTrace(); } ```
POI创建excel文件的问题
需要通过POI把合同内容写入到excel表,样式如图: ![图片说明](https://img-ask.csdn.net/upload/201612/19/1482139485_928128.png) 表中有图片,线条,合并单元格,以及各种字体和样式等; 现在想要从数据库中取出信息后,生成excel表, 每一页A4纸上最多显示两种产品信息, 如果合同中的产品种类多余2个, 就需要在下面另外打印一份合同 请大神帮忙给一下思路, 想来好久都不知道该怎么处理这种业务
JAVA POI 使用addMergedRegionUnsafe合并单元格操作导致导出时间大大增加,怎么解决?
![图片说明](https://img-ask.csdn.net/upload/201906/04/1559639243_381759.png) 测试过不添加合并语句,导出2万条数据也就10秒左右,但是加上合并之后时间直接延长至十多分钟,完全超出页面响应时间。就算是使用线程把2万数据分块来插入excel表格也不行,至少也要8分钟。不知道有没有接触过这类问题的大佬,提供一下解决的方法!!
java poi导出excel,用excel 2013打开样式不能正常显示
我用的是poi3.02。用2010打开没问题,用2013打开只是合并单元格的地方,边框样式不能显示。
java poi导出excel文档 后台报下标越界 但文档正常导出且损坏
public static SXSSFWorkbook createCSVUtil2(int startRow, String sheetName, SXSSFWorkbook wb, Map<String, List<CellModel>> cellListMap, Integer cellRowNum, List<LinkedHashMap> exportData, int[] columnWidth, int totalcolumn, GgreportingtemplateDto ggreportingtemplateDto, int countRow) throws Exception { // 设置表格名称 SXSSFSheet sheet = (SXSSFSheet) wb.createSheet(sheetName); sheet.trackAllColumnsForAutoSizing(); // 设置表格标题 一般都是第一行第一个格子 // 标题样式 if (ggreportingtemplateDto.getTitle() != null) { XSSFCellStyle cellStyleTitle = (XSSFCellStyle) wb.createCellStyle(); cellStyleTitle.setWrapText(true); SXSSFRow rowTitle = (SXSSFRow) sheet.createRow(0); XSSFFont fontTitle = (XSSFFont) wb.createFont(); fontTitle.setFontHeightInPoints((short) 16); cellStyleTitle.setFont(fontTitle); // 合并标题单元格 sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, totalcolumn - 1)); for (int i = 0; i < totalcolumn; i++) { if (i == 0) { SXSSFCell cell = (SXSSFCell) rowTitle.createCell(0); cell.setCellValue(ggreportingtemplateDto.getTitle()); cell.setCellStyle(cellStyleTitle); } else { SXSSFCell cell = (SXSSFCell) rowTitle.createCell(i); cell.setCellStyle(cellStyleTitle); } } } if (ggreportingtemplateDto.getCondition() != null) { // 设置筛选条件格子 一般是第二行第一列 // 条件样式 XSSFCellStyle cellStyleCondition = (XSSFCellStyle) wb.createCellStyle(); cellStyleCondition.setWrapText(true); SXSSFRow rowCondition = (SXSSFRow) sheet.createRow(1); XSSFFont fontCondition = (XSSFFont) wb.createFont(); fontCondition.setFontHeightInPoints((short) 16); cellStyleCondition.setFont(fontCondition); // 合并条件单元格 sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, 4)); for (int i = 0; i < 4; i++) { if (i == 0) { SXSSFCell cell = (SXSSFCell) rowCondition.createCell(0); cell.setCellValue(ggreportingtemplateDto.getCondition()); cell.setCellStyle(cellStyleCondition); } else { SXSSFCell cell = (SXSSFCell) rowCondition.createCell(i); cell.setCellStyle(cellStyleCondition); } } } // 设置表格通用样式 XSSFCellStyle cellStyle = (XSSFCellStyle) wb.createCellStyle(); // 设置边框 // 设置单元格内容水平对齐 cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER); // 设置单元格内容垂直对齐 cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER); // 设置自动换行 cellStyle.setWrapText(true); // 设置双边框 XSSFCellStyle cellStyleDouble = (XSSFCellStyle) wb.createCellStyle(); // 设置边框 // 设置单元格内容水平对齐 cellStyleDouble.setAlignment(XSSFCellStyle.ALIGN_CENTER); // 设置单元格内容垂直对齐 cellStyleDouble.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER); // 设置自动换行 cellStyleDouble.setWrapText(true); // 合并单元格 for (int t = 0; t < cellRowNum; t++) { SXSSFRow row = (SXSSFRow) sheet.createRow(t + startRow); List<CellModel> cellNameList = cellListMap.get(String.valueOf(t)); for (CellModel cellModel : cellNameList) { // 如果被合并的元素只占用了一个单元格则不进行合并 if (cellModel.getStartColumn() == cellModel.getEndColumn() && cellModel.getEndRow() == cellModel.getStartRow()) { continue; } sheet.addMergedRegion(new CellRangeAddress(cellModel.getStartRow(), cellModel.getEndRow(), cellModel.getStartColumn(), cellModel.getEndColumn())); } // create的cell Set<Integer> create = new HashSet<Integer>(); for (int i = 0; i < cellNameList.size(); i++) { CellModel cellModel = cellNameList.get(i); // 遍历插入表头 SXSSFCell cell = (SXSSFCell) row.createCell(cellModel.getStartColumn()); // 设置字体 XSSFFont font = (XSSFFont) wb.createFont(); font.setFontName("Times New Roman"); font.setFontHeightInPoints((short) 8); // 设置行高 if (i == 1) { row.setHeight((short) 500); } cellStyle.setFont(font); cell.setCellValue(cellModel.getCellName()); cell.setCellStyle(cellStyle); create.add(cellModel.getStartColumn()); } // 把所有没有create的cell都create for (int i = 0; i < totalcolumn; i++) { if (!(create.contains(i))) { // 设置字体 XSSFFont font = (XSSFFont) wb.createFont(); font.setFontName("Times New Roman"); font.setFontHeightInPoints((short) 8); cellStyle.setFont(font); SXSSFCell cell = (SXSSFCell) row.createCell(i); cell.setCellStyle(cellStyle); } } } for (LinkedHashMap hashMap : exportData) { SXSSFRow rowValue = (SXSSFRow) sheet.createRow(cellRowNum + startRow); Iterator<Map.Entry> iteratorRow = hashMap.entrySet().iterator(); while (iteratorRow.hasNext()) { Map.Entry entryRow = iteratorRow.next(); Integer key = Integer.valueOf(entryRow.getKey().toString()); String value = ""; if (entryRow.getValue() != null) { value = entryRow.getValue().toString(); } else { value = ""; } SXSSFCell cellValue = (SXSSFCell) rowValue.createCell(key - 1); // 设置字体 XSSFFont font = (XSSFFont) wb.createFont(); font.setFontName("Times New Roman"); font.setFontHeightInPoints((short) 8); cellValue.setCellValue(value); cellStyle.setFont(font); cellValue.setCellStyle(cellStyle); } cellRowNum++; } // 设置备注栏 List<String> reMarkList = ggreportingtemplateDto.getRemake(); if (reMarkList != null) { for (int i = 0; i < reMarkList.size() + 1; i++) { int rowNum = i + startRow + cellRowNum + 1; XSSFCellStyle cellStyleRemake = (XSSFCellStyle) wb.createCellStyle(); SXSSFRow rowRemake = (SXSSFRow) sheet.createRow(rowNum); XSSFFont fontRemake = (XSSFFont) wb.createFont(); fontRemake.setFontHeightInPoints((short) 8); cellStyleRemake.setFont(fontRemake); String cellValue = "Notes:"; // 合并条件单元格 if (i != 0) { sheet.addMergedRegion(new CellRangeAddress(rowNum, rowNum, 0, 4)); cellValue = reMarkList.get(i - 1); SXSSFCell cell = (SXSSFCell) rowRemake.createCell(0); cell.setCellValue(cellValue); cell.setCellStyle(cellStyleRemake); } else { SXSSFCell cell = (SXSSFCell) rowRemake.createCell(0); cell.setCellValue(cellValue); cell.setCellStyle(cellStyleRemake); } } } // 设置列宽 if (columnWidth != null) { for (int i = 0; i < columnWidth.length; i++) { sheet.setColumnWidth(i, columnWidth[i]); } } return wb; } 以上是我生成sheet表的内容 //exceptional Rpt public SXSSFWorkbook exceptionalRpt (GgreportingtemplateDto ggreportingtemplateDto, String startInputDate,String endInputDate) throws Exception { // 设置最大数据行数 SXSSFWorkbook wb = new SXSSFWorkbook(5050);//这里之前看到是说能设置这个表格最多能含有多少数据 Map<String, List<CellModel>> map = new HashMap<String, List<CellModel>>(); // 设置数据 // 第一级表头 List<CellModel> firstRow = new ArrayList<CellModel>(); CellModel cellModel1 = new CellModel(); // 总占用1行 Integer cellRow = 1; cellModel1.setCellName("Member English Name"); cellModel1.setStartRow(0); cellModel1.setEndRow(0); cellModel1.setStartColumn(0); cellModel1.setEndColumn(0); CellModel cellModel2 = new CellModel(); cellModel2.setCellName("Member Chinese Name"); cellModel2.setStartRow(0); cellModel2.setEndRow(0); cellModel2.setStartColumn(1); cellModel2.setEndColumn(1); CellModel cellModel3 = new CellModel(); cellModel3.setCellName("Staff No."); cellModel3.setStartRow(0); cellModel3.setEndRow(0); cellModel3.setStartColumn(2); cellModel3.setEndColumn(2); CellModel cellModel4 = new CellModel(); cellModel4.setCellName("HKID/Passport No."); cellModel4.setStartRow(0); cellModel4.setEndRow(0); cellModel4.setStartColumn(3); cellModel4.setEndColumn(3); CellModel cellModel5 = new CellModel(); cellModel5.setCellName("Sex"); cellModel5.setStartRow(0); cellModel5.setEndRow(0); cellModel5.setStartColumn(4); cellModel5.setEndColumn(4); CellModel cellModel6 = new CellModel(); cellModel6.setCellName("Plan Code"); cellModel6.setStartRow(0); cellModel6.setEndRow(0); cellModel6.setStartColumn(5); cellModel6.setEndColumn(5); CellModel cellModel7 = new CellModel(); cellModel7.setCellName("Plan Description"); cellModel7.setStartRow(0); cellModel7.setEndRow(0); cellModel7.setStartColumn(6); cellModel7.setEndColumn(6); CellModel cellModel8 = new CellModel(); cellModel8.setCellName("Effective Date"); cellModel8.setStartRow(0); cellModel8.setEndRow(0); cellModel8.setStartColumn(7); cellModel8.setEndColumn(7); CellModel cellModel9 = new CellModel(); cellModel9.setCellName("Status"); cellModel9.setStartRow(0); cellModel9.setEndRow(0); cellModel9.setStartColumn(8); cellModel9.setEndColumn(8); firstRow.add(cellModel1); firstRow.add(cellModel2); firstRow.add(cellModel3); firstRow.add(cellModel4); firstRow.add(cellModel5); firstRow.add(cellModel6); firstRow.add(cellModel7); firstRow.add(cellModel8); firstRow.add(cellModel9); map.put("0", firstRow); // 业务数据 List<LinkedHashMap> exportData = new ArrayList<LinkedHashMap>(); GuPolicyCopyItemMedgMembDto guPolicyCopyItemMedgMembDto = new GuPolicyCopyItemMedgMembDto(); List<GuPolicyCopyItemMedgMembDto> list = ServiceManager.prpall.getGuPolicyCopyItemMedgMembService().findALL(guPolicyCopyItemMedgMembDto, null);//这里查询出来是295条 //增加数据 用这端代码增加5000条数据 /*for (int i = 0; i < 5000; i++) { list.add((GuPolicyCopyItemMedgMembDto)list.get(0)); }*/ int countRow = 0; for (int i = 0; i < list.size(); i++) { GuPolicyCopyItemMedgMembDto data = (GuPolicyCopyItemMedgMembDto) list.get(i); LinkedHashMap<String,String> row = new LinkedHashMap<String,String>(); String struts = ""; String ename = ""; String cname = ""; String idno = ""; String staffno = ""; String sex = ""; String rationType = ""; String rationName = ""; String entryDate = ""; String chineseName = ""; String hKIDandPassportNo = ""; if(data.getFlag()==null||data.getFlag().equals("I")) { struts = "Add"; }else if(data.getFlag().equals("U")){ struts = "Amendment"; }else if(data.getFlag().equals("D")){ struts = "Deletion"; }else if(data.getFlag().equals("B")){ struts = "Cancellation"; } if(data.getClientEName() != null&&!(data.getClientEName().equals(""))) { ename = data.getClientEName(); } if(data.getClientCName() != null&&!(data.getClientCName().equals(""))) { cname = data.getClientCName(); } if(data.getIdNo() != null&&!(data.getIdNo().equals(""))) { idno = data.getIdNo(); } if(data.getStaffNo() != null&&!(data.getStaffNo().equals(""))) { staffno = data.getStaffNo(); } if(data.getSex() != null&&!(data.getSex().equals(""))) { sex = data.getSex(); } if(data.getRationType() != null&&!(data.getRationType().equals(""))) { rationType = data.getRationType(); } if(data.getRationName() != null&&!(data.getRationName().equals(""))) { rationName = data.getRationName(); } if(data.getEntryDate() != null) { entryDate = sim.format(data.getEntryDate()); } /*row.put("1", ""+ename+""); row.put("2", ""+cname+""); row.put("3", ""+staffno+""); row.put("4", ""+idno+""); row.put("5", ""+sex+""); row.put("6", ""+rationType+""); row.put("7", ""+rationName+""); row.put("8", ""+entryDate+""); row.put("9", ""+struts+"");*/ row.put("1", "1"); row.put("2", "2"); row.put("3", "3"); row.put("4", "4"); row.put("5", "5"); row.put("6", "6"); row.put("7", "7"); row.put("8", "8"); row.put("9", "9"); exportData.add(row); countRow++; } // 用于写入文件 // 列宽数组 int[] columnWidth = { 10000, 7500, 5000, 7500, 5000, 7500, 10000, 5000, 5000 }; // 报表标题 ggreportingtemplateDto.setTitle(null); List<String> remakeList = null; // 报表备注 ggreportingtemplateDto.setRemake(remakeList); ggreportingtemplateDto.setCondition(null); //数据分页 if(exportData.size()>5000) { double size = exportData.size(); double divisor = size/5000; int forNumber = (new Double(Math.ceil(divisor))).intValue(); for (int i = 0; i < forNumber; i++) { if((i+1)==forNumber) { List<LinkedHashMap> exportDataTemp = exportData.subList(0+(i*5000), exportData.size()-1); wb = this.createCSVUtil2(0, "Exceptional Rpt"+(i+1), wb, map, cellRow, exportDataTemp, columnWidth, columnWidth.length, ggreportingtemplateDto, 0); }else { List<LinkedHashMap> exportDataTemp = exportData.subList(0+(i*5000), 5000+(i*5000 )); wb = this.createCSVUtil2(0, "Exceptional Rpt"+(i+1), wb, map, cellRow, exportDataTemp, columnWidth, columnWidth.length, ggreportingtemplateDto, 0); } } }else { wb = this.createCSVUtil2(0, "Exceptional Rpt", wb, map, cellRow, exportData, columnWidth, columnWidth.length, ggreportingtemplateDto, 0); } /*wb = this.createCSVUtil2(0, "Exceptional Rpt", wb, map, cellRow, exportData, columnWidth, columnWidth.length, ggreportingtemplateDto, 0);*/ return wb; } 一开始SXSSFWorkbook wb = new SXSSFWorkbook(5050)这里的值给的5000 ,然后当数据量大于5000时直接报错,文件不能正常导出,然后我把5000改成7000,会报错但是文件能导出,是损坏文件,一条数据都没有,后来修改成分页导出,自己测试的时候任然报了数组下标越界,且越界的下标为负值,文件能正常导出,但导出的文件显示已损坏,看不到数据。报错代码图片以上传,求大神解答,解答有效我微信转账请大神喝奶茶 java.lang.ArrayIndexOutOfBoundsException: -20527 at java.util.ArrayList.elementData(ArrayList.java:418) at java.util.ArrayList.get(ArrayList.java:431) at org.apache.poi.xssf.model.StylesTable.getFontAt(StylesTable.java:386) at org.apache.poi.xssf.usermodel.XSSFWorkbook.getFontAt(XSSFWorkbook.java:954) at org.apache.poi.xssf.streaming.SXSSFWorkbook.getFontAt(SXSSFWorkbook.java:857) at org.apache.poi.ss.util.SheetUtil.getCellWidth(SheetUtil.java:148) at org.apache.poi.xssf.streaming.AutoSizeColumnTracker.updateColumnWidth(AutoSizeColumnTracker.java:367) at org.apache.poi.xssf.streaming.AutoSizeColumnTracker.updateColumnWidths(AutoSizeColumnTracker.java:333) at org.apache.poi.xssf.streaming.SXSSFSheet.flushOneRow(SXSSFSheet.java:1892) at org.apache.poi.xssf.streaming.SXSSFSheet.flushRows(SXSSFSheet.java:1871) at org.apache.poi.xssf.streaming.SXSSFSheet.flushRows(SXSSFSheet.java:1882) at org.apache.poi.xssf.streaming.SXSSFWorkbook.write(SXSSFWorkbook.java:931) at com.sinosoft.application.platform.web.action.GgReportingTemplateAction.download(GgReportingTemplateAction.java:267) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.sinosoft.application.common.BaseProcessAction.execute(BaseProcessAction.java:213) at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:216) at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:117) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196) at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432) at javax.servlet.http.HttpServlet.service(HttpServlet.java:661) at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:198) at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:176) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:265) at org.acegisecurity.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:107) at org.acegisecurity.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:72) at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275) at org.acegisecurity.ui.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:124) at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275) at org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:125) at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275) at org.acegisecurity.ui.rememberme.RememberMeProcessingFilter.doFilter(RememberMeProcessingFilter.java:142) at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275) at org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:81) at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275) at org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:271) at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275) at org.acegisecurity.ui.logout.LogoutFilter.doFilter(LogoutFilter.java:110) at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275) at org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:249) at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275) at org.acegisecurity.util.FilterChainProxy.doFilter(FilterChainProxy.java:149) at org.acegisecurity.util.FilterToBeanProxy.doFilter(FilterToBeanProxy.java:98) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at com.sinosoft.application.common.CAS_LANGUATE.doFilter(CAS_LANGUATE.java:35) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at com.sinosoft.sysframework.web.control.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:99) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at com.sinosoft.application.common.CompatibleFilter.doFilter(CompatibleFilter.java:29) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at com.sinosoft.application.common.ValidateSalt.doFilter(ValidateSalt.java:56) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:160) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at com.sinosoft.application.common.LoadSalt.doFilter(LoadSalt.java:41) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:660) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:798) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:808) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) 此问题已解决,导致报错的原因是sheet.trackAllColumnsForAutoSizing();poi自动设置列宽的代码,注释这行之后问题解决。
java poi excel导出 弹出框不出来!
下面是代码.所有代码都能执行完,没有报错,也不弹出保存窗口!求助... ``` /** * 导出 */ public void exportData(HttpServletResponse response) throws Exception { HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = null; // 创建一行 HSSFRow row = null; HSSFCell cell = null; HSSFCellStyle stringstyle = null; HSSFCellStyle headStyle = null; headStyle = workbook.createCellStyle(); headStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN); headStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN); headStyle.setBorderRight(XSSFCellStyle.BORDER_THIN); headStyle.setBorderTop(XSSFCellStyle.BORDER_THIN); headStyle.setFillForegroundColor(IndexedColors.AQUA.getIndex()); headStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); headStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER); HSSFFont headfont = workbook.createFont(); // 设置头部字体为宋体 headfont.setFontName("宋体"); // 粗体 headfont.setBoldweight(Font.BOLDWEIGHT_BOLD); headfont.setFontHeightInPoints((short) 11); // 单元格样式使用字体 headStyle.setFont(headfont); HSSFFont datafont = workbook.createFont(); stringstyle = workbook.createCellStyle(); stringstyle.setBorderBottom(XSSFCellStyle.BORDER_THIN); stringstyle.setBorderLeft(XSSFCellStyle.BORDER_THIN); stringstyle.setBorderRight(XSSFCellStyle.BORDER_THIN); stringstyle.setBorderTop(XSSFCellStyle.BORDER_THIN); stringstyle.setAlignment(XSSFCellStyle.ALIGN_CENTER); // 单元格样式使用字体 stringstyle.setFont(datafont); sheet = (HSSFSheet) workbook.createSheet(); sheet.setDefaultColumnWidth(16); //合并起始行,起始列,结束行,结束列 CellRangeAddress title1 = new CellRangeAddress(0, 0, 0, 10); sheet.addMergedRegion(title1); //设置第一行 row = (HSSFRow) sheet.createRow(0); cell = (HSSFCell) row.createCell(0); cell.setCellType(XSSFCell.CELL_TYPE_STRING); cell.setCellValue("部室员工绩效合约考核汇总表"); cell.setCellStyle(headStyle); //合并起始行,起始列,结束行,结束列 // CellRangeAddress row1 = new CellRangeAddress(1, 0, 1, 1); // sheet.addMergedRegion(row1); //设置第二行 row = (HSSFRow) sheet.createRow(1); cell = (HSSFCell) row.createCell(0); cell.setCellType(XSSFCell.CELL_TYPE_STRING); cell.setCellValue("项目"); cell.setCellStyle(headStyle); cell = (HSSFCell) row.createCell(1); cell.setCellType(XSSFCell.CELL_TYPE_STRING); cell.setCellValue("员工1"); cell.setCellStyle(headStyle); cell = (HSSFCell) row.createCell(2); cell.setCellType(XSSFCell.CELL_TYPE_STRING); cell.setCellValue("员工2"); cell.setCellStyle(headStyle); //合并起始行,起始列,结束行,结束列 // CellRangeAddress row2 = new CellRangeAddress(2, 0, 2, 1); // sheet.addMergedRegion(row2); //设置第三行 row = (HSSFRow) sheet.createRow(2); cell = (HSSFCell) row.createCell(0); cell.setCellType(XSSFCell.CELL_TYPE_STRING); cell.setCellValue("一、主体指标"); cell.setCellStyle(headStyle); cell = (HSSFCell) row.createCell(1); cell.setCellType(XSSFCell.CELL_TYPE_STRING); cell.setCellValue("111"); cell.setCellStyle(headStyle); cell = (HSSFCell) row.createCell(1); cell.setCellType(XSSFCell.CELL_TYPE_STRING); cell.setCellValue("222"); cell.setCellStyle(headStyle); ByteArrayOutputStream os = new ByteArrayOutputStream(); try { workbook.write(os); } catch (IOException e) { e.printStackTrace(); } byte[] content = os.toByteArray(); InputStream is = new ByteArrayInputStream(content); // 设置response参数,可以打开下载页面 response.reset(); response.setContentType("application/vnd.ms-excel;charset=utf-8"); response.setHeader("Content-Disposition", "attachment;filename=" + new String(("季度绩效工资分配.xls").getBytes(), "iso-8859-1")); ServletOutputStream out = response.getOutputStream(); BufferedInputStream bis = null; BufferedOutputStream bos = null; try { bis = new BufferedInputStream(is); bos = new BufferedOutputStream(out); byte[] buff = new byte[2048]; int bytesRead; // Simple read/write loop. while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) { bos.write(buff, 0, bytesRead); } bos.flush(); } catch (final IOException e) { throw e; } finally { if (bis != null) bis.close(); if (bos != null) bos.close(); } } } ```
poi3.8大数据量Excel导出连续查询导出不同的报表后导出速度非常慢
poi3.8用((SXSSFSheet)sheet).flushRows()方法解决了大数据量的excel导出,但是我在使用过程中,由于每个单元格都要设置不同的颜色和数据格式,发现导出第一张报表时速度还勉强可以接受,但是继续导出另一张报表,速度就慢的跟蜗牛似的,要10分钟甚至3个小时,请问有什么方法可以解决? 代码如下: private static void fillExcel(KDTable kdtReport, SXSSFWorkbook book, Sheet sheet) { int headRowCount = kdtReport.getHeadRowCount(); headRowCount=headRowCount+startRowCount; Font font=book.createFont(); font.setFontHeightInPoints((short)10); //改为保留整数 Short numFormat = book.createDataFormat().getFormat("0"); //numFormat==>0.00=0 //单元格样式或行样式 CellStyle cellStyle = book.createCellStyle(); // 建立新的cell样式 cellStyle.setBorderBottom(CellStyle.BORDER_THIN); //下边框 cellStyle.setBorderLeft(CellStyle.BORDER_THIN);//左边框 cellStyle.setBorderTop(CellStyle.BORDER_THIN);//上边框 cellStyle.setBorderRight(CellStyle.BORDER_THIN);//右边框 Set mergeBlockSet = new HashSet(); Cell cell = null; Object value = null; KDTMergeBlock mergeBlock = null; IRow row2 = null; Color color = null; Row row = null; int treeLevel = 0; short colorIndex = IndexedColors.WHITE.getIndex(); for (int i = 0; i < kdtReport.getRowCount(); i++) { row2 = kdtReport.getRow(i); treeLevel = row2.getTreeLevel(); color = row2.getStyleAttributes().getBackground(); row = sheet.getRow(i + headRowCount); if(row==null){ row = sheet.createRow(i+headRowCount); } cellStyle = book.createCellStyle(); cellStyle.setBorderBottom(CellStyle.BORDER_THIN); //下边框 cellStyle.setBorderLeft(CellStyle.BORDER_THIN);//左边框 cellStyle.setBorderTop(CellStyle.BORDER_THIN);//上边框 cellStyle.setBorderRight(CellStyle.BORDER_THIN);//右边框 cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); if(Color.white.getRed()==color.getRed()&&Color.white.getGreen()==color.getGreen()&&Color.white.getBlue()==color.getBlue()){ colorIndex = IndexedColors.WHITE.getIndex(); }else{ colorIndex = spaceColorIndex[treeLevel]; } cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); cellStyle.setFillForegroundColor(colorIndex); for (int j = 0; j < kdtReport.getColumnCount(); j++) { value = row2.getCell(j).getValue(); mergeBlock = row2.getCell(j).getMergeBlock(); if(mergeBlock!=null){ mergeBlockSet.add(mergeBlock); } if (value != null) { if(KDTableUtil.TREE_LEVEL_COLKEY.equals(kdtReport.getColumn(j).getKey()) || "curProject".equals(kdtReport.getColumn(j).getKey())){ if(!RptHelper.IndexHistoryChangeUIName.equals(tableName)){//指标历史变化表(这个好特殊啊) value = value.toString().trim(); value = space1[treeLevel]+value; } } cell = row.createCell(j); if(value instanceof BigDecimal || value instanceof Integer || value instanceof Long || value instanceof Double){ BigDecimal bValue = FDCHelper.toBigDecimal(value); if(bValue.compareTo(BigDecimal.ZERO)!=0){ cell.setCellValue(bValue.doubleValue()); cell.setCellType(XSSFCell.CELL_TYPE_NUMERIC); } cellStyle.setDataFormat(numFormat); cell.setCellStyle(cellStyle); }else{ cell.setCellValue(value.toString()); cell.setCellType(XSSFCell.CELL_TYPE_STRING); if(cellStyle!=null){ cell.setCellStyle(cellStyle); }else{ cellStyle = book.createCellStyle(); cell.setCellStyle(cellStyle); } } }else{ cell = row.createCell(j); cellStyle.setFillForegroundColor(colorIndex); cell.setCellStyle(cellStyle); } } //每100行,就设置分组和合并信息,最后把这100行内容从内存写入本地硬盘 if(i>1&&i%100==0){ System.out.println("i:"+i); try { // 设置分组和合并 setRowGroup(kdtReport, sheet); // 设置分组数据显示 sheet.setRowSumsBelow(false); sheet.setRowSumsRight(false); //这100行内容从内存写入本地硬盘 ((SXSSFSheet)sheet).flushRows(); cellStyle = book.createCellStyle(); } catch (IOException e) { e.printStackTrace(); } } } //把剩余行内容从内存写入本地硬盘 try { // 设置分组和合并 setRowGroup(kdtReport, sheet); // 设置分组数据显示 sheet.setRowSumsBelow(false); sheet.setRowSumsRight(false); ((SXSSFSheet)sheet).flushRows(); cellStyle = null; } catch (IOException e) { e.printStackTrace(); } Iterator iterator = mergeBlockSet.iterator(); CellRangeAddress cellRangeAddress =null; while (iterator.hasNext()) { mergeBlock = (KDTMergeBlock) iterator.next(); int left = mergeBlock.getLeft(); int right = mergeBlock.getRight(); int top=mergeBlock.getTop()+headRowCount; int bottom=mergeBlock.getBottom()+headRowCount; cellRangeAddress = new CellRangeAddress(top, bottom, left, right); sheet.addMergedRegion(cellRangeAddress); } }
java+poi实现下面的格式
![图片说明](https://img-ask.csdn.net/upload/201601/25/1453692519_563496.png) 请问怎么实现框框圈起来的部分?? 我的代码如下: public class ExportToExcelServiceImpl implements ExportToExcelService { @Autowired private ExportToExcelDao exportToExcelDao; public void setExportToExcelDao(ExportToExcelDao exportToExcelDao) { this.exportToExcelDao = exportToExcelDao; } /** * 导出合作渠道 * * @param HttpServletRequest * request, HttpServletResponse response, String startData, * String endtData * @return * */ @Override public void exportChannelToExcel(HttpServletRequest request, HttpServletResponse response, String startData, String endtData) { /** * 取出渠道数据 * */ List<CooperationChannel> channelList = exportToExcelDao .exportChannelToExcel(startData, endtData); // List<CooperationChannel> channelList = exportToExcelDao // .exportChannelToExcel(); /** * 创建渠道统计的excel * */ // 下载生成的合作渠道报表到自定义的位置 try { request.setCharacterEncoding("UTF-8"); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } response.setCharacterEncoding("UTF-8"); response.setContentType("application/octet-stream"); // 设置生成的文件类型 String filedisplay = "合作渠道报表.xls"; try { filedisplay = URLEncoder.encode(filedisplay, "UTF-8"); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } response.addHeader("Content-Disposition", "attachment;filename=" + filedisplay); // 设置文件头编码方式和文件名 // 创建一个workbook 对应一个excel应用文件 HSSFWorkbook workBook = new HSSFWorkbook(); // 在workbook中添加一个sheet,对应Excel文件中的sheet CellRangeAddress cra = new CellRangeAddress(0, 0, 0, 15); CellRangeAddress cra1 = new CellRangeAddress(1, 1, 0, 4); CellRangeAddress cra2 = new CellRangeAddress(1, 1, 5, 9); // CellRangeAddress cra3 = new CellRangeAddress(1, 1, 10, 15); HSSFSheet sheet = workBook.createSheet("合作渠道"); // 在sheet里增加合并单元格 sheet.addMergedRegion(cra); sheet.addMergedRegion(cra1); sheet.addMergedRegion(cra2); // sheet.addMergedRegion(cra3); // 获取表格样式 ExportUtil exportUtil = new ExportUtil(workBook, sheet); HSSFCellStyle titleStyle = exportUtil.getTitleStyle(); HSSFCellStyle titleStyle1 = exportUtil.getTitleStyle1(); HSSFCellStyle headStyle = exportUtil.getHeadStyle(); HSSFCellStyle bodyStyle = exportUtil.getBodyStyle(); // 构建表标题1 HSSFRow head = sheet.createRow(0); HSSFCell cell = null; String headTitle = "合作渠道数据统计表"; cell = head.createCell(0); cell.setCellStyle(titleStyle); cell.setCellValue(headTitle); // 构建表标题2 HSSFRow head1 = sheet.createRow(1); HSSFCell cell1 = null; String headTitle1= "部门:市场品牌部"; cell1 = head1.createCell(5); cell1.setCellStyle(titleStyle1); cell1.setCellValue(headTitle1); // 构建表标题2 // HSSFRow head2 = sheet.createRow(1); HSSFCell cell2 = null; String headTitle2= "日期:"; cell2 = head1.createCell(5); cell2.setCellStyle(titleStyle1); cell2.setCellValue(headTitle2); // // 构建表标题2 // HSSFRow head3 = sheet.createRow(1); // HSSFCell cell3 = null; // String headTitle3= "单位:元"; // cell3 = head3.createCell(4); // cell3.setCellStyle(headStyle); // cell3.setCellValue(headTitle3); // String[] headTitle1 = new String[] { "部门:市场品牌部", "日期:", "单位:元" }; // for (int i = 0; i < headTitle1.length; i++) { // cell = head1.createCell(i); // cell.setCellStyle(titleStyle1); // cell.setCellValue(headTitle1[i]); // } // 构建表头 HSSFRow headRow = sheet.createRow(2); String[] titles = new String[] { "序号", "渠道名称", "点击量", "下载量", "激活数", "注册数", "注册率", "实名数", "实名率", "登录数", "绑卡数", "绑卡率", "投资数", "投资率", "充值总额", "投资总额" }; for (int i = 0; i < titles.length; i++) { cell = headRow.createCell(i); cell.setCellStyle(headStyle); cell.setCellValue(titles[i]); } // 构建表体数据 if (channelList != null && channelList.size() > 0) { for (int j = 2; j < channelList.size(); j++) { HSSFRow bodyRow = sheet.createRow(j + 1); CooperationChannel cooperationChannel = channelList.get(j); // getChannel_id,并把数据写入excel中的单元格,下同。 cell = bodyRow.createCell(0); cell.setCellStyle(bodyStyle); cell.setCellValue(cooperationChannel.getChannel_id()); // getChannel_name cell = bodyRow.createCell(1); cell.setCellStyle(bodyStyle); cell.setCellValue(cooperationChannel.getChannel_name()); // getClick_amount cell = bodyRow.createCell(2); cell.setCellStyle(bodyStyle); cell.setCellValue(cooperationChannel.getClick_amount()); // getDownload_amount cell = bodyRow.createCell(3); cell.setCellStyle(bodyStyle); cell.setCellValue(cooperationChannel.getDownload_amount()); // getActivation_amount cell = bodyRow.createCell(4); cell.setCellStyle(bodyStyle); cell.setCellValue(cooperationChannel.getActivation_amount()); // getRegister_amount cell = bodyRow.createCell(5); cell.setCellStyle(bodyStyle); cell.setCellValue(cooperationChannel.getRegister_amount()); // getRegister_rate cell = bodyRow.createCell(6); cell.setCellStyle(bodyStyle); cell.setCellValue(cooperationChannel.getRegister_rate()); // getAutonym_amount cell = bodyRow.createCell(7); cell.setCellStyle(bodyStyle); cell.setCellValue(cooperationChannel.getAutonym_amount()); // getAutonym_rate cell = bodyRow.createCell(8); cell.setCellStyle(bodyStyle); cell.setCellValue(cooperationChannel.getAutonym_rate()); // getLogin_amount cell = bodyRow.createCell(9); cell.setCellStyle(bodyStyle); cell.setCellValue(cooperationChannel.getLogin_amount()); // getBound_card_amount cell = bodyRow.createCell(10); cell.setCellStyle(bodyStyle); cell.setCellValue(cooperationChannel.getBound_card_amount()); // getBound_card_rate cell = bodyRow.createCell(11); cell.setCellStyle(bodyStyle); cell.setCellValue(cooperationChannel.getBound_card_rate()); // getInvestment_amount cell = bodyRow.createCell(12); cell.setCellStyle(bodyStyle); cell.setCellValue(cooperationChannel.getInvestment_amount()); // getInvestment_rate cell = bodyRow.createCell(13); cell.setCellStyle(bodyStyle); cell.setCellValue(cooperationChannel.getInvestment_rate()); // getRecharge_total_amount cell = bodyRow.createCell(14); cell.setCellStyle(bodyStyle); cell.setCellValue(cooperationChannel.getRecharge_total_amount()); // getInvestment_total_amount cell = bodyRow.createCell(15); cell.setCellStyle(bodyStyle); cell.setCellValue(cooperationChannel .getInvestment_total_amount()); } } try { // FileOutputStream fos = new FileOutputStream( // "C:\\Users\\lida\\Desktop\\testData\\fr0_markbran_001.xls"); OutputStream ops = response.getOutputStream(); workBook.write(ops); ops.flush(); ops.close(); } catch (IOException e) { e.printStackTrace(); // } finally { // try { // // fos.close(); // } catch (IOException e) { // e.printStackTrace(); // } } }
相见恨晚的超实用网站
搞学习 知乎:www.zhihu.com 简答题:http://www.jiandati.com/ 网易公开课:https://open.163.com/ted/ 网易云课堂:https://study.163.com/ 中国大学MOOC:www.icourse163.org 网易云课堂:study.163.com 哔哩哔哩弹幕网:www.bilibili.com 我要自学网:www.51zxw
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载    点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量 path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。
字节跳动视频编解码面经
引言 本文主要是记录一下面试字节跳动的经历。 三四月份投了字节跳动的实习(图形图像岗位),然后hr打电话过来问了一下会不会opengl,c++,shador,当时只会一点c++,其他两个都不会,也就直接被拒了。 七月初内推了字节跳动的提前批,因为内推没有具体的岗位,hr又打电话问要不要考虑一下图形图像岗,我说实习投过这个岗位不合适,不会opengl和shador,然后hr就说秋招更看重基础。我当时
开源一个功能完整的SpringBoot项目框架
福利来了,给大家带来一个福利。 最近想了解一下有关Spring Boot的开源项目,看了很多开源的框架,大多是一些demo或者是一个未成形的项目,基本功能都不完整,尤其是用户权限和菜单方面几乎没有完整的。 想到我之前做的框架,里面通用模块有:用户模块,权限模块,菜单模块,功能模块也齐全了,每一个功能都是完整的。 打算把这个框架分享出来,供大家使用和学习。 为什么用框架? 框架可以学习整体
源码阅读(19):Java中主要的Map结构——HashMap容器(下1)
(接上文《源码阅读(18):Java中主要的Map结构——HashMap容器(中)》) 3.4.4、HashMap添加K-V键值对(红黑树方式) 上文我们介绍了在HashMap中table数组的某个索引位上,基于单向链表添加新的K-V键值对对象(HashMap.Node&lt;K, V&gt;类的实例),但是我们同时知道在某些的场景下,HashMap中table数据的某个索引位上,数据是按照红黑树
c++制作的植物大战僵尸,开源,一代二代结合游戏
    此游戏全部由本人自己制作完成。游戏大部分的素材来源于原版游戏素材,少部分搜集于网络,以及自己制作。 此游戏为同人游戏而且仅供学习交流使用,任何人未经授权,不得对本游戏进行更改、盗用等,否则后果自负。 目前有六种僵尸和六种植物,植物和僵尸的动画都是本人做的。qq:2117610943 开源代码下载 提取码:3vzm 点击下载--&gt; 11月28日 新增四种植物 统一植物画风,全部修
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
Python——画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)
最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成喔~) one 樱花树 动态生成樱花 效果图(这个是动态的): 实现代码 import turtle as T import random import time # 画樱花的躯干(60,t) def Tree(branch
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 顺便拉下票,我在参加csdn博客之星竞选,欢迎投票支持,每个QQ或者微信每天都可以投5票,扫二维码即可,http://m234140.nofollow.ax.
Python 基础(一):入门必备知识
目录1 标识符2 关键字3 引号4 编码5 输入输出6 缩进7 多行8 注释9 数据类型10 运算符10.1 常用运算符10.2 运算符优先级 1 标识符 标识符是编程时使用的名字,用于给变量、函数、语句块等命名,Python 中标识符由字母、数字、下划线组成,不能以数字开头,区分大小写。 以下划线开头的标识符有特殊含义,单下划线开头的标识符,如:_xxx ,表示不能直接访问的类属性,需通过类提供
深度学习图像算法在内容安全领域的应用
互联网给人们生活带来便利的同时也隐含了大量不良信息,防范互联网平台有害内容传播引起了多方面的高度关注。本次演讲从技术层面分享网易易盾在内容安全领域的算法实践经验,包括深度学习图
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 欢迎 改进 留言。 演示地点跳到演示地点 html代码如下`&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;music&lt;/title&gt; &lt;meta charset="utf-8"&gt
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。 1. for - else 什么?不是 if 和 else 才
数据库优化 - SQL优化
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7
通俗易懂地给女朋友讲:线程池的内部原理
餐厅的约会 餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”我楞了一下,心里想女朋友今天是怎么了,怎么突然问出这么专业的问题,但做为一个专业人士在女朋友面前也不能露怯啊,想了一下便说:“我先给你讲讲我前同事老王的故事吧!” 大龄程序员老王 老王是一个已经北漂十多年的程序员,岁数大了,加班加不动了,升迁也无望,于是拿着手里
经典算法(5)杨辉三角
写在前面: 我是 扬帆向海,这个昵称来源于我的名字以及女朋友的名字。我热爱技术、热爱开源、热爱编程。技术是开源的、知识是共享的。 这博客是对自己学习的一点点总结及记录,如果您对 Java、算法 感兴趣,可以关注我的动态,我们一起学习。 用知识改变命运,让我们的家人过上更好的生活。 目录一、杨辉三角的介绍二、杨辉三角的算法思想三、代码实现1.第一种写法2.第二种写法 一、杨辉三角的介绍 百度
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹
面试官:你连RESTful都不知道我怎么敢要你?
面试官:了解RESTful吗? 我:听说过。 面试官:那什么是RESTful? 我:就是用起来很规范,挺好的 面试官:是RESTful挺好的,还是自我感觉挺好的 我:都挺好的。 面试官:… 把门关上。 我:… 要干嘛?先关上再说。 面试官:我说出去把门关上。 我:what ?,夺门而去 文章目录01 前言02 RESTful的来源03 RESTful6大原则1. C-S架构2. 无状态3.统一的接
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
Python 编程实用技巧
Python是一门很灵活的语言,也有很多实用的方法,有时候实现一个功能可以用多种方法实现,我这里总结了一些常用的方法,并会持续更新。
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,
程序员:我终于知道post和get的区别
IT界知名的程序员曾说:对于那些月薪三万以下,自称IT工程师的码农们,其实我们从来没有把他们归为我们IT工程师的队伍。他们虽然总是以IT工程师自居,但只是他们一厢情愿罢了。 此话一出,不知激起了多少(码农)程序员的愤怒,却又无可奈何,于是码农问程序员。 码农:你知道get和post请求到底有什么区别? 程序员:你看这篇就知道了。 码农:你月薪三万了? 程序员:嗯。 码农:你是怎么做到的? 程序员:
"狗屁不通文章生成器"登顶GitHub热榜,分分钟写出万字形式主义大作
前言 GitHub 被誉为全球最大的同性交友网站,……,陪伴我们已经走过 10+ 年时间,它托管了大量的软件代码,同时也承载了程序员无尽的欢乐。 上周给大家分享了一篇10个让你笑的合不拢嘴的Github项目,而且还拿了7万+个Star哦,有兴趣的朋友,可以看看, 印象最深刻的是 “ 呼吸不止,码字不停 ”: 老实交代,你是不是经常准备写个技术博客,打开word后瞬间灵感便秘,码不出字? 有什么
推荐几款比较实用的工具,网站
1.盘百度PanDownload 这个云盘工具是免费的,可以进行资源搜索,提速(偶尔会抽风????) 不要去某站买付费的???? PanDownload下载地址 2.BeJSON 这是一款拥有各种在线工具的网站,推荐它的主要原因是网站简洁,功能齐全,广告相比其他广告好太多了 bejson网站 3.二维码美化 这个网站的二维码美化很好看,网站界面也很...
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI 算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC
Spring Security 实战干货:基于注解的接口角色访问控制
1. 前言 欢迎阅读 Spring Security 实战干货[1] 系列文章 。在上一篇 基于配置的接口角色访问控制[2] 我们讲解了如何通过 javaConfig 的方式配置接口的角色访问控制。其实还有一种更加灵活的配置方式 基于注解 。今天我们就来探讨一下。DEMO 获取方式在文末。 2. Spring Security 方法安全 Spring Security 基于注解的安全...
8年经验面试官详解 Java 面试秘诀
    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实
面试官如何考察你的思维方式?
1.两种思维方式在求职面试中,经常会考察这种问题:北京有多少量特斯拉汽车? 某胡同口的煎饼摊一年能卖出多少个煎饼? 深圳有多少个产品经理? 一辆公交车里能装下多少个乒乓球? 一
相关热词 c# plc s1200 c#里氏转换原则 c# 主界面 c# do loop c#存为组套 模板 c# 停掉协程 c# rgb 读取图片 c# 图片颜色调整 最快 c#多张图片上传 c#密封类与密封方法
立即提问