-
Excel导出合并单元格导致数据丢失
2019-12-22 16:17:52Excel导出合并单元格,导致数据丢失Excel导出合并单元格导致数据丢失
场景:
Excel导出,涉及到单元格的合并。 在处理完每一行的数据后,需要对同一个id的单元行进行合并,却发现,合并后出现数据丢失。 本该有31条数据,但是到处的excel加上合并的行,只有31行(excel的行标)。 一定是合并的时候出现了问题
方案
经过debug排查,发现是如下代码合并问题
if(treeValueListSize > 1){ for(int n = 0; n < firstTitleNodeIndex; n++){ CellRangeAddress region = new CellRangeAddress(dataRow, dataRow + treeValueListSize-1, n, n); sheet.addMergedRegion(region); } for(int n = lastTitleNodeIndex + 1; n < title.length; n++){ CellRangeAddress region = new CellRangeAddress(dataRow, dataRow + treeValueListSize-1, n, n); sheet.addMergedRegion(region); } dataRow += treeValueListSize; }
这里涉及到
sheet.addMergedRegion(region)
这个方法,方法如下sheet.addMergedRegion(new CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol)
代码从这里走过后, sheet里面的rows出现混乱。 初步猜测是这里的问题。
那怎么办呢?
猜想: 是在处理每一组数据的同时,进行excel行合并,导致出现问题。
方案
-
重写合并方法,将所有excel行都先生成后,然后进行统一标记合并。 对每一组数据,记录要合并的 行号和列号。 修改。 成功!
-
仔细研究之前的代码,网上搜,边处理数据,边合并单元格。 也搜不到。 合并的单元格 为 region, 却在debug的里面找不到。。。。 放弃
-
-
java 复杂表头excel导出合并单元格
2021-03-10 10:51:35定义导出excel复杂表头 @ExcelProperty 这是最常用的一个注解,注解中有三个参数value,index,converter分别代表列明,列序号,数据转换方式,注意value={“A”,“B”},如图“A”代表同一单元格上层,“B”下层 @...easyexcel-wraper
easyexcel-wraper是什么?
一个方便读取excel内容,且可以使用注解进行内容验证的包装工具用到alibaba 2.1.4版本
定义导出excel复杂表头
@ExcelProperty
这是最常用的一个注解,注解中有三个参数value,index,converter分别代表列明,列序号,数据转换方式,注意value={“A”,“B”},如图“A”代表同一单元格上层,“B”下层
@ColumnWidth
设置单元格的宽度package com.hhh.sup.project.model; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.alibaba.excel.metadata.BaseRowModel; import lombok.Data; /** * @Description: 工程状态统计导出 * @Author 3hcw * @Date 2021/2/3 15:01 */ @Data public class ProjectStatusExportBean extends BaseRowModel { //序号 @ColumnWidth(10) @ExcelProperty(index = 0,value = {"序号"}) private Integer xh; @ColumnWidth(20) @ExcelProperty(index = 1,value = {"施工许可号"}) private String builderLicense; @ColumnWidth(20) @ExcelProperty(index = 2,value = {"报监编号"}) private String zlProjectNum; @ColumnWidth(40) @ExcelProperty(index = 3,value = {"工程名称"}) private String projectName; @ColumnWidth(20) @ExcelProperty(index = 4,value = {"工程情况","建筑类别"}) private String buildType; @ColumnWidth(20) @ExcelProperty(index = 5,value = {"工程情况","具体类型"}) private String buildChildType; @ColumnWidth(20) @ExcelProperty(index = 6,value = {"工程情况","监督面积(㎡)"}) private String allArea; @ColumnWidth(20) @ExcelProperty(index = 7,value = {"工程情况","工程造价(万元)"}) private String projectCost; @ColumnWidth(20) @ExcelProperty(index =8,value = {"工程情况","地上层次"}) private String floorUp; @ColumnWidth(20) @ExcelProperty(index = 9,value = {"工程情况","地下层次"}) private String floorDown; @ColumnWidth(20) @ExcelProperty(index = 10,value = {"工程情况","高度"}) private String buildHeightStr; @ColumnWidth(20) @ExcelProperty(index = 11,value = {"工程情况","工程报监日期"}) private String reportDate; @ColumnWidth(20) @ExcelProperty(index = 12,value = {"工程情况","实际开工日期"}) private String beginDate; @ColumnWidth(20) @ExcelProperty(index = 13,value = {"工程情况","建设单位"}) private String jsUnit; @ColumnWidth(20) @ExcelProperty(index = 14,value = {"工程情况","施工单位"}) private String sgUnit; @ColumnWidth(20) @ExcelProperty(index = 15,value = {"工程情况","监理单位"}) private String jlUnit; @ColumnWidth(20) @ExcelProperty(index = 16,value = {"工程情况","设计单位"}) private String sjUnit; @ColumnWidth(20) @ExcelProperty(index = 17,value = {"工程情况","勘察单位"}) private String kcUnit; @ColumnWidth(20) @ExcelProperty(index = 18,value = {"工程情况","图审机构"}) private String tsUnit; @ColumnWidth(20) @ExcelProperty(index = 19,value = {"工程情况","检测机构"}) private String jcUnit; @ColumnWidth(20) @ExcelProperty(index = 20,value = {"工程情况","工程地址"}) private String address; @ColumnWidth(20) @ExcelProperty(index = 21,value = {"形象进度","桩基"}) private String zj; @ColumnWidth(20) @ExcelProperty(index = 22,value = {"形象进度","深基坑"}) private String sjk; @ColumnWidth(20) @ExcelProperty(index = 23,value = {"形象进度","基础"}) private String jc; @ColumnWidth(20) @ExcelProperty(index = 24,value = {"形象进度","主体"}) private String zt; @ColumnWidth(20) @ExcelProperty(index = 25,value = {"形象进度","装饰"}) private String zs; @ColumnWidth(20) @ExcelProperty(index = 26,value = {"形象进度","节能"}) private String jn; @ColumnWidth(20) @ExcelProperty(index = 27,value = {"形象进度","幕墙"}) private String mq; @ColumnWidth(20) @ExcelProperty(index = 28,value = {"竣工验收日期"}) private String endDate; @ColumnWidth(20) @ExcelProperty(index = 29,value = {"监督小组成员"}) private String monitorZl; @ColumnWidth(20) @ExcelProperty(index = 30,value = {"备注"}) private String remark; }
Controller层
@PostMapping("/projectStatusExportExcel") public void projectStatusExportExcel(ManagerProjectBean bean, HttpServletResponse response, HttpSession session) { // 判断是否可以获取到用户 UserInfoBean userInfoBean = (UserInfoBean) session.getAttribute("userInfoBean"); if (FundStringUtil.isEmpty(userInfoBean) && FundStringUtil.isNotEmpty(bean.getUserId())) { userInfoBean = personService.findUserInfoBean(bean.getUserId()); } if (FundStringUtil.isNotEmpty(userInfoBean.getCompanyType())) { if (VersionMonitorTypeEnum.SUP_VERSION_MONITOR_TYPE_02.getCode().equalsIgnoreCase(userInfoBean.getVersionType())) { bean.setAqGovunitId(userInfoBean.getCompanyId()); } else { bean.setZlGovunitId(userInfoBean.getCompanyId()); } } if (null != userInfoBean) { try { List<ProjectStatusExportBean> list = managerProjectService.findManagerProjectStatusList(bean, userInfoBean); String sheetName = "工程状态统计"; // ExportUtils.writeSingleExcel(sheetName,sheetName,list, ProjectStatusExportBean.class); ExportUtils.writeSingleExcel(new MergeStrategy(list.size(),1),sheetName,sheetName,list, ProjectStatusExportBean.class); } catch (IOException e) { e.printStackTrace(); } } }
编写一个ExportUtils工具类
public static <T> void writeSingleExcel(MergeStrategy mergeStrategy,String fileName,String sheetName, List<T> tList, Class tClass) throws IOException{ HttpServletResponse response = RequestHolder.getResponse(); try (ServletOutputStream outputStream = response.getOutputStream()){ setResponse(fileName, response); EasyExcel.write(outputStream, tClass).autoCloseStream(Boolean.FALSE) .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) .registerWriteHandler(new CustomCellWriteHandler()) .sheet(sheetName) .registerWriteHandler(mergeStrategy) .doWrite(tList); } catch (Exception e) { errorWrite(response, e); } } /** * 设置导出信息 * @param fileName * @param response * @throws UnsupportedEncodingException */ private static void setResponse(String fileName, HttpServletResponse response) throws UnsupportedEncodingException { // 重置response response.reset(); response.setContentType("application/vnd.ms-excel;charset=utf-8"); response.setCharacterEncoding("utf-8"); // 这里URLEncoder.encode可以防止中文乱码 fileName = URLEncoder.encode(fileName + DateTimeFormatter.ofPattern("yyyy-MM-dd_HH_mm_ss").format(LocalDateTime.now()) + ExcelTypeEnum.XLSX.getValue(), "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName); }
自定义拦截器。对第一行第一列的头超链接到:https://blog.csdn.net/HXNLYW
package com.hhh.framework.handler; import com.alibaba.excel.metadata.CellData; import com.alibaba.excel.metadata.Head; import com.alibaba.excel.write.handler.CellWriteHandler; import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; import com.alibaba.excel.write.metadata.holder.WriteTableHolder; import org.apache.poi.common.usermodel.HyperlinkType; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CreationHelper; import org.apache.poi.ss.usermodel.Hyperlink; import org.apache.poi.ss.usermodel.Row; import java.util.List; /** * 自定义拦截器。对第一行第一列的头超链接到:https://blog.csdn.net/HXNLYW * * @author subway */ public class CustomCellWriteHandler implements CellWriteHandler { @Override public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) { } @Override public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) { } @Override public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) { if (isHead && cell.getColumnIndex() == 0) { CreationHelper createHelper = writeSheetHolder.getSheet().getWorkbook().getCreationHelper(); Hyperlink hyperlink = createHelper.createHyperlink(HyperlinkType.URL); hyperlink.setAddress("https://blog.csdn.net/HXNLYW"); cell.setHyperlink(hyperlink); } } }
自定义的合并策略,参考官方文档的LoopMergeStrategy
package com.hhh.framework.util; import com.alibaba.excel.metadata.Head; import com.alibaba.excel.write.merge.AbstractMergeStrategy; import org.apache.commons.collections.map.HashedMap; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.util.CellRangeAddress; import java.util.Arrays; import java.util.HashSet; import java.util.Map; import java.util.Set; /** * @Description: 自定义的合并策略,参考官方文档的LoopMergeStrategy * @Author 3hcw * @Date 2021-03-08 18:37:37 */ public class MergeStrategy extends AbstractMergeStrategy { // 合并的列编号,从0开始,指定的index或自己按字段顺序数 private Set<Integer> mergeCellIndex = new HashSet<>(); // 数据集大小,用于区别结束行位置 private Integer maxRow = 0; // 禁止无参声明 private MergeStrategy() { } //mergeCellIndex哪列数据需要合并 public MergeStrategy(Integer maxRow, int... mergeCellIndex) { Arrays.stream(mergeCellIndex).forEach(item -> { this.mergeCellIndex.add(item); }); this.maxRow = maxRow; } // 记录上一次合并的信息 private Map<Integer, MergeRange> lastRow = new HashedMap(); // 每行每列都会进入,绝对不要在这写循环 @Override protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) { int currentCellIndex = cell.getColumnIndex(); // 判断该行是否需要合并 if (mergeCellIndex.contains(currentCellIndex)) { String currentCellValue = cell.getStringCellValue(); int currentRowIndex = cell.getRowIndex(); if (!lastRow.containsKey(currentCellIndex)) { // 记录首行起始位置 lastRow.put(currentCellIndex, new MergeRange(currentCellValue, currentRowIndex, currentRowIndex, currentCellIndex, currentCellIndex)); return; } //有上行这列的值了,拿来对比. MergeRange mergeRange = lastRow.get(currentCellIndex); if (!(mergeRange.lastValue != null && mergeRange.lastValue.equals(currentCellValue))) { // 结束的位置触发下合并. // 同行同列不能合并,会抛异常 if (mergeRange.startRow != mergeRange.endRow || mergeRange.startCell != mergeRange.endCell) { sheet.addMergedRegionUnsafe(new CellRangeAddress(mergeRange.startRow, mergeRange.endRow, mergeRange.startCell, mergeRange.endCell)); } // 更新当前列起始位置 lastRow.put(currentCellIndex, new MergeRange(currentCellValue, currentRowIndex, currentRowIndex, currentCellIndex, currentCellIndex)); } // 合并行 + 1 mergeRange.endRow += 1; // 结束的位置触发下最后一次没完成的合并 if (relativeRowIndex.equals(maxRow - 1)) { MergeRange lastMergeRange = lastRow.get(currentCellIndex); // 同行同列不能合并,会抛异常 if (lastMergeRange.startRow != lastMergeRange.endRow || lastMergeRange.startCell != lastMergeRange.endCell) { sheet.addMergedRegionUnsafe(new CellRangeAddress(lastMergeRange.startRow, lastMergeRange.endRow, lastMergeRange.startCell, lastMergeRange.endCell)); } } } } } class MergeRange { public int startRow; public int endRow; public int startCell; public int endCell; public String lastValue; public MergeRange(String lastValue, int startRow, int endRow, int startCell, int endCell) { this.startRow = startRow; this.endRow = endRow; this.startCell = startCell; this.endCell = endCell; this.lastValue = lastValue; } }
页面html
//新增按钮 $("#export").click(function () { $("#exportProjectForm").attr("action", getRootPath() + "sup/projectRegisterRest/projectStatusExportExcel"); $("#exportProjectForm").submit(); });
最后导出效果
寄语
技术来之不易,望各位码友多多分享
-
POI excel 导出合并单元格工具
2019-03-01 11:09:37* 把从数据库读出的数据写成excel */ public class WriteExcelUtil { public int writeExcel(String filePath , List<Map<String, Object>> data) throws IOExc...自己写的一个工具类,传入拿到的数据,并且可以邻近相同数据的util
/** * 把从数据库读出的数据写成excel */ public class WriteExcelUtil { public int writeExcel(String filePath , List<Map<String, Object>> data) throws IOException { //创建excel HSSFWorkbook wb = new HSSFWorkbook();//创建Excel工作簿对象 HSSFSheet sheet = wb.createSheet("人员信息");//创建工作表并命名 HSSFCellStyle cellStyle = wb.createCellStyle();//创建单元格样式 //写入数据 writeData(sheet,data); //合并单元格 //行合并 mergeCell(sheet); //列合并 mergeRow(sheet); //以 文件名 + 精确到秒的时间.xls 的格式命名 FileOutputStream out = new FileOutputStream(filePath+"sample"+ getTime() +".xls"); wb.write(out); out.close();//关闭文件流 return 1; } /** * * @return */ public String getTime(){ Date now = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); String time = dateFormat.format( now ); return time; } /** * 数据写入sheet * @param sheet * @param data * @return */ public int writeData(HSSFSheet sheet,List<Map<String, Object>> data){ for (int i=0;i<data.size();i++) { HSSFRow row = sheet.createRow(i); //int num = 0; int len = data.get(i).size(); for (int j=1;j <= 27;j++) { ; row.createCell(j-1).setCellValue(data.get(i).get("COL"+j).toString()); //设置Excel工作表的值 } } return 1; } /** * 比较列中相同单元格并合并 * @param sheet * @return */ public int mergeRow(HSSFSheet sheet){ int rowNum = sheet.getLastRowNum()+1;//注意:此处有n行获取到n-1 int cellNum = sheet.getRow(0).getLastCellNum(); //总共的列数量 注意:此处有n行获取到n int strat=-1,end=-1,flag=-1; String cellValue1="",cellValue2=""; for(int i=0;i < cellNum ;i++) { for (int j = 0; j < rowNum - 1; j++) { cellValue1 = sheet.getRow(j).getCell(i).getStringCellValue(); cellValue2 = sheet.getRow(j + 1).getCell(i).getStringCellValue(); //相等则记录相等起始位置 if( cellValue1.trim().equals(cellValue2.trim()) ){ if(strat == -1 ){ strat=j; // end=j+1; flag=i; }else{ end++; } }else{ if(strat !=-1 ){ sheet.addMergedRegion(new CellRangeAddress(strat, end,flag,flag)); strat=-1; end=-1; flag=-1; } } //判断此列是否结束 且 是否需要合并单元格 if(strat !=-1 && j == rowNum - 2 ){ sheet.addMergedRegion(new CellRangeAddress(strat, end,flag,flag)); strat=-1; end=-1; flag=-1; } } } if(strat !=-1 ){ sheet.addMergedRegion(new CellRangeAddress(strat, end,flag,flag)); strat=-1; end=-1; flag=-1; } return 1; } /** * 合并单元格行 * @param sheet * @return */ public int mergeCell(HSSFSheet sheet){ int rowNum = sheet.getLastRowNum()+1;//注意:此处有n行获取到n-1 int cellNum = sheet.getRow(0).getLastCellNum(); //总共的列数量 注意:此处有n行获取到n int strat=-1,end=-1,flag=-1; String cellValue1="",cellValue2=""; for(int i=0;i < rowNum ;i++){ for(int j=0;j < cellNum - 1;j++){ cellValue1=sheet.getRow(i).getCell(j).getStringCellValue(); cellValue2=sheet.getRow(i).getCell(j+1).getStringCellValue(); if( cellValue1.trim().equals(cellValue2.trim()) ){ if(strat == -1 ){ strat=j; end=j+1; flag=i; }else{ end++; } }else{ if(strat !=-1 ){ sheet.addMergedRegion(new CellRangeAddress(flag,flag,strat, end)); strat=-1; end=-1; flag=-1; } } //判断此列是否结束 且 是否需要合并单元格 if(strat !=-1 && j == rowNum - 2 ){ sheet.addMergedRegion(new CellRangeAddress(flag,flag,strat, end)); strat=-1; end=-1; flag=-1; } } } if(strat !=-1 ){ sheet.addMergedRegion(new CellRangeAddress(flag,flag,strat, end)); strat=-1; end=-1; flag=-1; } return 1; } }
下面展示一组设计好的数据合并成的表头
-
为什么不居中(CellRangeAddress),关于excel导出合并单元格
2020-03-30 10:19:12一、最近做一个导出excel需求,按理说很简单,但是发现写公共方法的哥们儿并没有搞合并单元格,而且也不太熟悉他的那种写法,所以简单研究了下,和大家讨论,至少思路千万条,越想越明了。 1、之前的写法简单看下,...一、最近做一个导出excel需求,按理说很简单,但是发现写公共方法的哥们儿并没有搞合并单元格,而且也不太熟悉他的那种写法,所以简单研究了下,和大家讨论,至少思路千万条,越想越明了。
1、之前的写法简单看下,不晓得从哪个网上拷贝的,哈哈。大概思路是:定义三个数组(导出excel实体的字段名,表头名,每列宽度设置),通过反射获取这些参数。
2、接下来具体看封装的ExeclUtils工具类,反射就不在这赘述了,重点说HSSFCellStyle样式的设置,其中有2个居中(垂直居中和水平居中)。// 设置水平垂直居中方式 HSSFCellStyle style = workbook.createCellStyle(); style.setAlignment(HSSFCellStyle.ALIGN_CENTER); style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); ... // 中间省略 // 单元格创建、设置内容和样式(真正生效一定是样式被设置到单元格上) HSSFCell cell = row1.createCell(j); cell.setCellValue(value[j]); cell.setCellStyle(style ); // 按理说这2个设置后,合并单元格就可以居中了,但是却遗漏了一个点,就是单元格合并是动态的,需要明确单元格合并数,不然会出现,单元格是合并了,但是单元格是上水平居中。
3、合并单元格居中,单元格如果是动态的,那么你就要明确给CellRangeAddress几行几列合并多少个。
// 合并单元格,四个参数分别是行号的起止、列号的起止,比如下面这个,列号相同,都是变量k,说明只是单元格合并行号 CellRangeAddress range = new CellRangeAddress(i - temp + 1, i, k, k); sheet.addMergedRegion(range);
4、毕竟是公共类,为了不影响已有功能,简单开了一个分支出来写需要合并单元格的需求,方法不要太多,但是如果是我封装,我还是会定义一个注解,然后反射高度处理更多关于excel导入导出所需要求。
/** * 一个定制化合并单元格代码简单示例。1、需求只合并行号。2、什么情况相邻行能合并 */ @SuppressWarnings({ "deprecation", "unchecked" }) private static <T> void contractExcel(List<T> data, HSSFSheet sheet1, HSSFRow row1, String[] method, HSSFCellStyle ALIGN_CENTER) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { List<T> list = (List<T>) data; for (int i = 1; i < list.size(); i++) { // 此处发现不同的业务合并单元格要求不一样,此处强转成不同的类,按时处理什么情况能合并单元格。 // 上一个单元格合同号(get(0)是第一个) String oldContractId = list.get(i - 1).getContractId(); int size = 0; String newContractId = ""; if(i != list.size()) { // 当前单元格合同号 newContractId = list.get(i).getContractId(); size = list.stream().filter(m -> m.getContractId().equals(oldContractId)).collect(Collectors.toList()) .size(); } int temp = size; row1 = sheet1.createRow(i); // 集合取0开始(本来就知道是某个对象了,不应该这么搞,拷贝方便,暂时不管) T t = data.get(i - 1); Class<?> clas = t.getClass(); a: for (int j = 0; j < method.length; j++) { Method m = clas.getMethod(method[j]); Object value = m.invoke(t); HSSFCell cell = row1.createCell(j); cell.setCellStyle(ALIGN_CENTER); if (value == null) { cell.setCellValue(""); } else if (value instanceof String) { cell.setCellValue((String) value); } else if (value instanceof Long) { cell.setCellValue((Long) value); } else if (value instanceof BigDecimal) { cell.setCellValue(((BigDecimal) value).doubleValue()); } else if (value instanceof Integer) { cell.setCellValue((Integer) value); } else if (value instanceof LocalDateTime) { cell.setCellValue( ((LocalDateTime) value).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); } else { throw new BussnisException(StateCommonCode.COMMON_SYSTEM_ERROR, "系统错误,没有相应实体的数据类型,请添加"); } if (i > 1) { if (!oldContractId.equals(newContractId) && temp > 1) { for (int l = size; l > 0;) { if (size == 1) { for (int k = 0; k < 21; k++) { cell.setCellStyle(ALIGN_CENTER); // 合并单元格,只是行合并 CellRangeAddress range = new CellRangeAddress(i - temp + 1, i, k, k); sheet1.addMergedRegion(range); } } else { size--; } continue a; } } } } } }
-
javaweb项目 基于poi的excel导出 合并单元格
2017-08-31 17:39:00代码:sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, firstCol, lastCol));CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol)参数:起始行号,终止行号, 起始列号,... -
java导出excel合并单元格_Java 导出Excel 合并Excel单元格
2021-02-12 18:15:04/***导出Excel表格**@paramallList要导出的数据*@paramheadArrjson键值对*@paramtitleArrexcel标题*@paramtitleExcel名字*@parammergeColumn要合并的列*/publicvoidexportExcel(JSONArrayallList,String[]headA... -
php根据excel模板导出excel并合并单元格
2018-10-26 09:26:38php根据excel模板导出excel并合并单元格,根据模板导出会少写很多样式的代码,非常方便 -
java excel 导出 单元格合并_java导出excel合并单元格.docx
2021-02-27 19:41:29// 指定单元格垂直居中对齐 cellStyle.setWrapText(true); cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN); cellStyle.setBorderRight(HSSFCellStyle.... -
excel poi工具类 导入 导出 合并单元格 计算公式
2021-01-07 10:36:47excel poi工具类 导入 导出 合并单元格 计算公式 -
Springboot导出excel,合并单元格示例
2019-01-21 13:26:34原文链接:Springboot导出excel,合并单元格示例 更多文章,欢迎访问:Java知音,一个专注于技术分享的网站 以下用一个示例来说明springboot如何导出数据到excel。 首先引入Maven依赖: <dependency> ... -
java excel 列合并单元格_poi导出excel根据列合并单元格
2021-02-27 19:38:37//合并单元格 if(poiModel.getRowIndex() != i + dataSatrtIndex - 1) { sheet1.addMergedRegion(new CellRangeAddress(poiModel.getRowIndex(), i + dataSatrtIndex - 1, poiModel.getCellIndex(), poiModel.... -
java导出excel合并单元格_Springboot导出excel,合并单元格示例
2021-02-12 18:15:07//创建poi导出数据对象 SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(); //创建sheet页 SXSSFSheet sheet = sxssfWorkbook.createSheet("开复工项目"); CellRangeAddress region1 = new CellRangeAddress(0, 1... -
poi 合并单元格_Springboot导出excel,合并单元格示例
2020-12-06 14:58:33Java知音网站链接:www.javazhiyin.com/27467.html以下用一个示例来说明springboot如何导出数据到excel。首先引入Maven依赖: org.apache.poi poi 3.17 org.apache.poi poi-ooxml 3.17 org.apache.poi poi-oox... -
java 生成excel 单元格合并_Java导出Excel合并单元格
2021-02-26 17:54:041、问题背景利用POI导出Excel表格,在导出的过程中涉及到双表头,即需要合并单元格2、实现源码/**** @Project:Report* @Title:MergeCell.java* @Package:com.you.excel* @Description:* @Author:YouHaiDong* @Date:... -
Java导出Excel合并单元格
2019-02-07 13:56:11Java导出Excel合并单元格 -
java excel 合并单元格_java实现数据的Excel导出(合并单元格、样式等)
2021-02-12 14:11:53} /**合并单元格的例子 //表头样式设置 HSSFRow row0 = sheet.createRow(0); createMyCells(0,19,row0,titleRowStyle); sheet.addMergedRegion(getMyRegion(0, 2, 0, 0)); addMyTitle(row0, 0, "跟进人名称"); ... -
excel 导出及单元格合并
2014-08-13 16:00:13合并单元格类 public ActionForward doExport(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { log.info("doExport...&... -
java excel导出 jxl_java使用JXL导出Excel及合并单元格
2021-02-27 19:44:39jxl是一个韩国人写的java操作excel的工具,在开源世界中,有两套比较有影响的API可供使用,一个是POI,一个是jExcelAPI。其中功能相对POI比较弱一点。但jExcelAPI对中文支持非常好,API是纯Java的,并不依赖Windows...