1、下图excel,如何导出这样含有合并单元格的excel?
2、解决办法
excel自带合并单元格方法,调用方法即可。
步骤如下:
1、由于是合并单元格,所以每行的列数不一样。但是,我们每行插入的列数必须是最多的列数,方便合并单元格,而且也能控制单元格的格式(如线框颜色之类)
代码如下
//列名 String[] columnName = { "序号","借款申请ID", "当前期数", "总期数", "借款主体", "贷款金额", "放款日期", "应还日期", "计息天数","客户","","资方名称","","运金所","","状态"}; String[] secondColumnName = { "单价", "应收利息","单价", "应收利息","单价", "服务费"}; // 创建每列的栏目标题名 createColunmName(myStyle, sheet, cell, row, workbook, 1, columnName); //创建二级栏目标题名 createSecondColunmName(myStyle, sheet, cell, row, workbook, 2, secondColumnName,9); /** * 创建一级栏目 */ public void createColunmName(HSSFCellStyle myStyle, Sheet sheet, Cell cell, Row row, HSSFWorkbook workbook, int rowIndex, String[] columnName) { // 创建第2行列名称数据 row = sheet.createRow(rowIndex);// excel坐标从0开始 row.setHeight((short) 400); // 插入数据 for (int i = 0; i < columnName.length; i++) { cell = row.createCell(i); cell.setCellValue(columnName[i]); cell.setCellStyle(myStyle); } } /** * 创建二级栏目 */ public static void createSecondColunmName(HSSFCellStyle myStyle, Sheet sheet, Cell cell, Row row, HSSFWorkbook workbook, int rowIndex, String[] columnName,int index) { // 创建二级栏目的列名称数据 row = sheet.createRow(rowIndex);// excel坐标从0开始 row.setHeight((short) 400); // 插入数据 for (int i = index; i < columnName.length + index; i++) { cell = row.createCell(i); cell.setCellValue(columnName[i - index]); cell.setCellStyle(myStyle); } //设置第2行空余格式 for (int i = 0; i < index; i++) { cell = row.createCell(i); cell.setCellStyle(myStyle); } cell = row.createCell(15); cell.setCellStyle(myStyle); }
2、合并单元格。上下合并或左右合并。
因为上图的excel合并单元格在中间,所以我把excel分成了三段。
第一段,合并单元格区域之前的列。
第二段,合并单元格区域。
第三段,合并单元格区域之后的列。
public void mergeColunm(Sheet sheet) { //合并 //第一段, for (int i = 0; i < 9; i++) { sheet.addMergedRegion(new CellRangeAddress(1, 2, i, i)); } //第二段, sheet.addMergedRegion(new CellRangeAddress(1, 1, 9, 10)); sheet.addMergedRegion(new CellRangeAddress(1, 1, 11, 12)); sheet.addMergedRegion(new CellRangeAddress(1, 1, 13, 14)); //第三段 sheet.addMergedRegion(new CellRangeAddress(1, 2, 15, 15)); }
3、每行按最多的列数插入数据。
由于插入数据比较简单,且与合并单元格并无关系,所以免去不展示代码部分,每行只需按最多的列数插入数据即可。
小结
以上,就可以作出合并单元格的excel。可能大家对有些数字看不懂,代码里充斥了一些列数的数字,如下面这行代码
sheet.addMergedRegion(new CellRangeAddress(1, 1, 9, 10));
因为不同的表格合并区域可能不同,所以这里并没有把这个方法封装进工具类,直接使用了数字。
为了让大家能够理解的更清楚,我特地借鉴了一部分核心代码贴在下面:
/** * 合并单元格 * @Title:MergeCell * @Description: * @param args * @Date:2015年11月4日 下午2:36:46 * @return: void * @throws Exception */ @SuppressWarnings({ "resource", "deprecation" }) public static void main(String[] args) throws Exception { //创建workbook HSSFWorkbook workbook = new HSSFWorkbook(); //创建sheet页 HSSFSheet sheet = workbook.createSheet("学生表"); //创建单元格 HSSFRow row = sheet.createRow(0); HSSFCell c0 = row.createCell(0); c0.setCellValue(new HSSFRichTextString("学号")); HSSFCell c1 = row.createCell(1); c1.setCellValue(new HSSFRichTextString("姓名")); HSSFCell c2 = row.createCell(2); c2.setCellValue(new HSSFRichTextString("性别")); HSSFCell c3 = row.createCell(3); c3.setCellValue(new HSSFRichTextString("年龄")); HSSFCell c4 = row.createCell(4); c4.setCellValue(new HSSFRichTextString("2015年分数")); HSSFCell c5 = row.createCell(7); c5.setCellValue(new HSSFRichTextString("2014年分数")); HSSFRow row1 = sheet.createRow(1); HSSFCell c6 = row1.createCell(4); c6.setCellValue(new HSSFRichTextString("语文")); HSSFCell c7 = row1.createCell(5); c7.setCellValue(new HSSFRichTextString("数学")); HSSFCell c8 = row1.createCell(6); c8.setCellValue(new HSSFRichTextString("外语")); HSSFCell c9 = row1.createCell(7); c9.setCellValue(new HSSFRichTextString("语文")); HSSFCell c10 = row1.createCell(8); c10.setCellValue(new HSSFRichTextString("数学")); HSSFCell c11 = row1.createCell(9); c11.setCellValue(new HSSFRichTextString("外语")); Region region1 = new Region(0, (short)0, 1, (short)0); Region region2 = new Region(0, (short)1, 1, (short)1); Region region3 = new Region(0, (short)2, 1, (short)2); Region region4 = new Region(0, (short)3, 1, (short)3); Region region5 = new Region(0, (short)4, 0, (short)6); Region region6 = new Region(0, (short)7, 0, (short)9); sheet.addMergedRegion(region1); sheet.addMergedRegion(region2); sheet.addMergedRegion(region3); sheet.addMergedRegion(region4); sheet.addMergedRegion(region5); sheet.addMergedRegion(region6); FileOutputStream stream = new FileOutputStream("d:/student.xls"); workbook.write(stream); }
效果图: