常规表格样式的Excel导出,

有一种不是常规表格样式的Excel导出,

比如如下这种怎么办

快速的excel框架API肯定不支持这种

所以我们需要自定义格子的内容

  private CellStyle getCellStyle2(XSSFWorkbook workbook, int x) {
Font font2 = workbook.createFont();
font2.setBold(true);
font2.setFontHeightInPoints((short) x);
CellStyle cellStyle2 = workbook.createCellStyle();
cellStyle2.setBorderBottom(BorderStyle.THIN); //下边框
cellStyle2.setBorderLeft(BorderStyle.THIN);//左边框
cellStyle2.setBorderTop(BorderStyle.THIN);//上边框
cellStyle2.setBorderRight(BorderStyle.THIN);//右边框
cellStyle2.setFont(font2);
// 居中
cellStyle2.setAlignment(HorizontalAlignment.CENTER);
return cellStyle2;
} @Override
public XSSFWorkbook createSampleInboundAndOutboundXSSFWorkbook(List<SampleInboundAndOutbound> sampleInboundAndOutbounds) {
XSSFWorkbook workbook = new XSSFWorkbook();
// 创建工作表并设置表名
XSSFSheet sheet = workbook.createSheet("样品出入库登记表");
// 设置字体样式
CellStyle cellStyle = getCellStyle2(workbook, 12);
// 【第一行】 创建行,下标从0开始
XSSFRow row = sheet.createRow(0);
XSSFCell cell = row.createCell(0);
// 设置每一列宽度
for (int i = 0; i < 4; i++) {
sheet.setColumnWidth(i, 15 * 256);
}
cell.setCellValue("样品出入库登记表");
cell.setCellStyle(cellStyle);
// 合并第一行数据 前4个单元格
CellRangeAddress region = new CellRangeAddress(0, 0, 0, 3);
sheet.addMergedRegion(region); int rownumIndex = 1;
for (SampleInboundAndOutbound sampleInboundAndOutbound : sampleInboundAndOutbounds) {
SampleInfoVo sampleInfoVo = sampleInboundAndOutbound.getSampleInfoVo();
if (sampleInfoVo == null) {
continue;
}
// 创建表头行
XSSFRow row2 = sheet.createRow(rownumIndex);
XSSFCell cell1 = row2.createCell(0);
cell1.setCellValue("样品编号");
XSSFCell cell1_value = row2.createCell(1);
cell1_value.setCellValue(sampleInfoVo.getSampleCode());
XSSFCell cell2 = row2.createCell(2);
cell2.setCellValue("样品名称");
XSSFCell cell2_value = row2.createCell(3);
cell2_value.setCellValue(sampleInfoVo.getSampleName()); rownumIndex++;
XSSFRow row3 = sheet.createRow(rownumIndex);
XSSFCell cell1_2 = row3.createCell(0);
cell1_2.setCellValue("产品型号");
XSSFCell cell1_value_2 = row3.createCell(1);
cell1_value_2.setCellValue(sampleInfoVo.getProductModel());
XSSFCell cell2_2 = row3.createCell(2);
cell2_2.setCellValue("型号类型");
XSSFCell cell2_value_2 = row3.createCell(3);
Dictionary varFive1 = dictionaryRemoteService.getByTypeAndCode("sample.product.type", String.valueOf(sampleInfoVo.getProductType()));
cell2_value_2.setCellValue(varFive1.getName()); rownumIndex++;
XSSFRow row4 = sheet.createRow(rownumIndex);
XSSFCell cell1_3 = row4.createCell(0);
cell1_3.setCellValue("负责部门");
XSSFCell cell1_value_3 = row4.createCell(1);
cell1_value_3.setCellValue(sampleInfoVo.getDutyDepartment());
XSSFCell cell2_3 = row4.createCell(2);
cell2_3.setCellValue("负责人");
XSSFCell cell2_value_3 = row4.createCell(3);
cell2_value_3.setCellValue(sampleInfoVo.getDutyPersonName()); rownumIndex++;
XSSFRow row5 = sheet.createRow(rownumIndex);
XSSFCell cell1_4 = row5.createCell(0);
cell1_4.setCellValue("项目平台");
XSSFCell cell1_value_4 = row5.createCell(1);
Dictionary varFive4 = dictionaryRemoteService.getByTypeAndCode("sample.model.platform", sampleInfoVo.getProjectPlatform());
cell1_value_4.setCellValue(varFive4.getName());
XSSFCell cell2_4 = row5.createCell(2);
cell2_4.setCellValue("具体车型项目");
XSSFCell cell2_value_4 = row5.createCell(3);
Dictionary varFive2 = dictionaryRemoteService.getByTypeAndCode("task.project.name", String.valueOf(sampleInboundAndOutbound.getProjectName()));
sampleInboundAndOutbound.setProjectNameStr(varFive2.getName());
cell2_value_4.setCellValue(varFive2.getName()); rownumIndex++;
XSSFRow row6 = sheet.createRow(rownumIndex);
XSSFCell cell1_5 = row6.createCell(0);
cell1_5.setCellValue("试验类型");
XSSFCell cell1_value_5 = row6.createCell(1);
cell1_value_5.setCellValue(sampleInboundAndOutbound.getTestItemTypeName());
XSSFCell cell2_5 = row6.createCell(2);
cell2_5.setCellValue("试验代号");
XSSFCell cell2_value_5 = row6.createCell(3);
cell2_value_5.setCellValue(sampleInboundAndOutbound.getTestItemCode()); rownumIndex++;
XSSFRow row7 = sheet.createRow(rownumIndex);
XSSFCell cell1_7 = row7.createCell(0);
cell1_7.setCellValue("试验名称");
XSSFCell cell1_value_7 = row7.createCell(1);
cell1_value_7.setCellValue(sampleInboundAndOutbound.getTestItemName());
CellRangeAddress region2 = new CellRangeAddress(rownumIndex, rownumIndex, 1, 3);
sheet.addMergedRegion(region2); List<SampleReceiver> sampleReceiverList = sampleInboundAndOutbound.getSampleReceiverList();
if (CollectionUtils.isNotEmpty(sampleReceiverList)) {
for (SampleReceiver sampleReceiver : sampleReceiverList) {
rownumIndex++;
XSSFRow row8 = sheet.createRow(rownumIndex);
XSSFCell cell1_8 = row8.createCell(0);
cell1_8.setCellValue("接收人");
XSSFCell cell1_value_8 = row8.createCell(1);
cell1_value_8.setCellValue(sampleReceiver.getReceiver());
XSSFCell cell2_8 = row8.createCell(2);
cell2_8.setCellValue("接收时间");
XSSFCell cell2_value_8 = row8.createCell(3);
String receiveDate = DateFormatUtils.format(sampleReceiver.getReceiveDate(), "yyyy-MM-dd");
cell2_value_8.setCellValue(receiveDate); rownumIndex++;
XSSFRow row9 = sheet.createRow(rownumIndex);
XSSFCell cell1_9 = row9.createCell(0);
cell1_9.setCellValue("实验室");
XSSFCell cell1_value_9 = row9.createCell(1);
cell1_value_9.setCellValue(sampleReceiver.getLaboratory());
XSSFCell cell2_9 = row9.createCell(2);
cell2_9.setCellValue("接收数量");
XSSFCell cell2_value_9 = row9.createCell(3);
cell2_value_9.setCellValue(sampleReceiver.getReceiverCount()); rownumIndex++;
XSSFRow row10 = sheet.createRow(rownumIndex);
XSSFCell cell1_10 = row10.createCell(0);
cell1_10.setCellValue("检查结果");
XSSFCell cell1_value_10 = row10.createCell(1);
Dictionary varFive3 = dictionaryRemoteService.getByTypeAndCode("sample.check.result", String.valueOf(sampleReceiver.getCheckResult()));
cell1_value_10.setCellValue(varFive3.getName());
CellRangeAddress region4 = new CellRangeAddress(rownumIndex, rownumIndex, 1, 3);
sheet.addMergedRegion(region4);
}
}
List<SampleAccepter> sampleAccepterList = sampleInboundAndOutbound.getSampleAccepterList();
if (CollectionUtils.isNotEmpty(sampleAccepterList)) {
for (SampleAccepter sampleAccepter : sampleAccepterList) {
rownumIndex++;
XSSFRow row9 = sheet.createRow(rownumIndex);
XSSFCell cell1_9 = row9.createCell(0);
cell1_9.setCellValue("归还接收人");
XSSFCell cell1_value_9 = row9.createCell(1);
cell1_value_9.setCellValue(sampleAccepter.getAccepter());
XSSFCell cell2_9 = row9.createCell(2);
cell2_9.setCellValue("归还时间");
XSSFCell cell2_value_9 = row9.createCell(3);
String acceptDate = DateFormatUtils.format(sampleAccepter.getAcceptDate(), "yyyy-MM-dd");
cell2_value_9.setCellValue(acceptDate); rownumIndex++;
XSSFRow row10 = sheet.createRow(rownumIndex);
XSSFCell cell1_10 = row10.createCell(0);
cell1_10.setCellValue("归还原因");
XSSFCell cell1_value_10 = row10.createCell(1);
cell1_value_10.setCellValue(sampleAccepter.getRevertReason() + sampleAccepter.getRemark());
CellRangeAddress region4 = new CellRangeAddress(rownumIndex, rownumIndex, 1, 3);
sheet.addMergedRegion(region4);
}
}
}
return workbook;
}

over--就是创建每一行每一列,填充值的操作------类似需求可以自己参考

顺带多一嘴

整齐地方式也可以这样操作

@Override
public XSSFWorkbook creatWorkbookTaskTestItemSampleRepair(List<TaskTestItemSampleRepair> itemSampleRepairs) {
XSSFWorkbook workbook = new XSSFWorkbook();
String[] titleArray = {
"样品编号", "产品型号", "生产企业", "批次号", "故障日期", "修复日期", "修复人",
"故障原因", "修复情况"
};
int[] needAddColumnWidth = {7, 8};
XSSFSheet sheet = getInitXSSFSheet(workbook, "样品维修表", titleArray.length - 1);
int rownumIndex = 1;
XSSFRow row2 = sheet.createRow(rownumIndex);
this.setSheetBeginTitleRow(titleArray, sheet, workbook, row2, needAddColumnWidth);
rownumIndex++;
CellStyle cellStyle2 = getCellStyle2(workbook, 10);
for (TaskTestItemSampleRepair itemSampleRepair : itemSampleRepairs) {
XSSFRow row3 = sheet.createRow(rownumIndex);
for (int columnIndex = 0; columnIndex < titleArray.length; columnIndex++) {
XSSFCell cell1_2 = row3.createCell(columnIndex);
switch (columnIndex) {
case 0:
cell1_2.setCellValue(itemSampleRepair.getSampleCode());
break;
case 1:
cell1_2.setCellValue(itemSampleRepair.getProductModel());
break;
case 2:
cell1_2.setCellValue(itemSampleRepair.getProduceCompany());
break;
case 3:
cell1_2.setCellValue(itemSampleRepair.getBatch());
break;
case 4:
if (itemSampleRepair.getFaultDate() != null) {
String faultDate = DateFormatUtils.format(itemSampleRepair.getFaultDate(), "yyyy-MM-dd");
cell1_2.setCellValue(faultDate);
} else {
cell1_2.setCellValue(itemSampleRepair.getFaultDate());
}
break;
case 5:
if (itemSampleRepair.getRepairDate() != null) {
String repairDate = DateFormatUtils.format(itemSampleRepair.getRepairDate(), "yyyy-MM-dd");
cell1_2.setCellValue(repairDate);
} else {
cell1_2.setCellValue(itemSampleRepair.getRepairDate());
}
break;
case 6:
cell1_2.setCellValue(itemSampleRepair.getRepairer());
break;
case 7:
cell1_2.setCellValue(itemSampleRepair.getFaultRemark());
break;
case 8:
cell1_2.setCellValue(itemSampleRepair.getRepairRemark());
break;
default:
break;
}
cell1_2.setCellStyle(cellStyle2);
}
}
return workbook;
} private XSSFSheet getInitXSSFSheet(XSSFWorkbook workbook, String sheetName, int cellRangeLastCol) {
// 创建工作表并设置表名
XSSFSheet sheet = workbook.createSheet(sheetName);
// 设置字体样式
CellStyle cellStyle = getCellStyle2(workbook, 14);
// 【第一行】 创建行,下标从0开始
XSSFRow row = sheet.createRow(0);
XSSFCell cell = row.createCell(0);
cell.setCellValue(sheetName);
cell.setCellStyle(cellStyle);
// 合并第一行数据 前10个单元格
CellRangeAddress region = new CellRangeAddress(0, 0, 0, cellRangeLastCol);
sheet.addMergedRegion(region);
return sheet;
} private void setSheetBeginTitleRow(String[] titleArray, XSSFSheet sheet, XSSFWorkbook workbook, XSSFRow row2, int[] needAddColumnWidth) {
CellStyle cellStyle = getCellStyle2(workbook, 13);
for (int i = 0; i < titleArray.length; i++) {
XSSFCell var0001 = row2.createCell(i);
var0001.setCellValue(titleArray[i]);
var0001.setCellStyle(cellStyle);
if (ArrayUtils.contains(needAddColumnWidth, i)) {
sheet.setColumnWidth(i, 35 * 256);
} else {
sheet.setColumnWidth(i, 15 * 256);
}
}
} private CellStyle getCellStyle2(XSSFWorkbook workbook, int x) {
Font font2 = workbook.createFont();
font2.setBold(true);
font2.setFontHeightInPoints((short) x);
CellStyle cellStyle2 = workbook.createCellStyle();
cellStyle2.setBorderBottom(BorderStyle.THIN); //下边框
cellStyle2.setBorderLeft(BorderStyle.THIN);//左边框
cellStyle2.setBorderTop(BorderStyle.THIN);//上边框
cellStyle2.setBorderRight(BorderStyle.THIN);//右边框
cellStyle2.setFont(font2);
// 居中
cellStyle2.setAlignment(HorizontalAlignment.CENTER);
return cellStyle2;
}

使用PIO自定义每一个格子的属性和值,完全DIY--Excel,不整齐也可以实现的更多相关文章

  1. [Jmeter]Xpath获取元素某个属性的值,以及获取最后一个元素某个属性的值

    XPath获取元素某个属性的值 XPath query:  clients/attribute::total XPath获取最后一个元素某个属性的值 XPath query:   /clients/c ...

  2. js为一个对象Object添加一个新的属性和值

    1, var obj = {}; //或者 var obj=new Object(); var key = "name"; var value = "张三丰" ...

  3. AngularJS自定义指令directive:scope属性 (转载)

    原文地址:http://blog.csdn.net/VitaLemon__/article/details/52213103 一.介绍: 在AngularJS中,除了内置指令如ng-click等,我们 ...

  4. 自定义模拟一个Spring IOC容器

    一.模拟一个IOC容器: 介绍:现在,我们准备使用一个java project来模拟一个spring的IOC容器创建对象的方法,也就是不使用spring的jar自动帮助我们创建对象,而是通过自己手动书 ...

  5. .使用 HTML+CSS 实现如图布局,border-widht 5px,一个格子大小是 50*50,hover时候边框变为红色(兼容IE6+,考虑语义化的结构)

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  6. wpf RadioButton控件的一个bug,onpropertychanged后会修改旧属性的值

    测试代码下载:http://files.cnblogs.com/djangochina/RadioButtonBug.zip 从上面列表选择不同的行,再设置下面不同的radiobutton看看结果 b ...

  7. python--把一个方法变成属性调用

    # coding=utf-8 ''' 装饰器(decorator)可以给函数动态加上功能,对于类的方法,装饰器一样起作用.Python内置的@property装饰器就是负责把一个方法变成属性调用的: ...

  8. 【iOS 】UIView 中有一个autoresizingMask的属性

    在 UIView 中有一个autoresizingMask的属性,它对应的是一个枚举的值(如下),属性的意思就是自动调整子控件与父控件中间的位置,宽高. 1 2 3 4 5 6 7 8 9 enum  ...

  9. React修改state(非redux)中数组和对象里边的某一个属性的值

    在使用React时,会经常需要处理state里边设置的初始值以达到我们的实际需求,比如从接口获取到列表数据后要赋值给定义的列表初始值,然后数据驱动view视图进而呈现在我们眼前,这种最简单的赋值方式实 ...

  10. Qt+QGIS二次开发:自定义类实现查询矢量数据的属性字段值(图查属性)

    在GIS领域,有两种重要的查询操作,图查属性和属性查图. 本文主要介绍如何在QGIS中通过从QgsMapToolIdentify中派生自定义类实现查询矢量数据的属性字段值(图查属性). 重点参考资料: ...

随机推荐

  1. Git Permission denied

    问题现象 家里电脑 git pull 项目时,提示:Permission denied,ssh -T 测试又是正常的,如下图 同样配置和密钥,在公司电脑就可以正常 pull .push . 问题原因 ...

  2. Linux下获取文件名

    linux 下一切皆文件 1.获取指定路径下文件或目录 ls -la /usr/local/ |grep xxx | head -n 1 |awk '{print$9}'xxx : 替换为要匹配的文件 ...

  3. WPF 动态加载嵌入主程序的DLL

    WPF 动态加载嵌入主程序的DLL,好处是节省文件数量,坏处是启动影响加载速度. 首先将DLL添加进项目,选择添加现有项,设置生成操作为"嵌入资源". 代码: public App ...

  4. WPF 加载外部字体

    例如将字体放入d:/Fonts 文件夹.然后就可以通过类似 btn.FontFamily = new FontFamily("file:///d:/Fonts/#Ashley"); ...

  5. const 用法详解

    1. 类的成员函数声明为const类型,在类外定义的时候,也需要添加const 2. 如果常成员函数修改了成员变量,会在编译的时候检查出来错误! 其实关于const用错的报错都是在编译阶段出现的!(大 ...

  6. MPC收藏

    收集有关MPC的优秀文章,方便查阅. 同态加密 原理 介绍 程序员的干货!核心理论之同态加密 https://mp.weixin.qq.com/s/1uH0UjnS_Mo8ShXJ-16UXw BGV ...

  7. 【推荐】一款开源且成熟的OA协同办公系统,自带低代码开发功能!

    项目介绍 今天给大家推荐一款开源且拥有成熟的OA办公系统功能,自带低代码开发平台,可以快速搭建OA系统.人事系统.CRM系统.办公用品系统.项目管理系统.合同管理系统等,让你可以快速上手.快速实施.快 ...

  8. Hutch PG walkthrough Intermediate window

    NMAP └─# nmap -p- -A -sS 192.168.196.122 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-12-16 01 ...

  9. Win7下的文件权限

    平常编写的程序总会有配置功能,然后配置肯定是以文本文件的方式存放在目录下.平常自己电脑测试没问题 发到客户那里总会有各种乱七八糟的状况 反映配置无法保存.先前早知道win7有管理员权限的机制,然后还刻 ...

  10. 智算引领 AI启航,中国电信天翼云助推辽宁数智发展!

    近日,中国电信辽宁公司"智算引领 AI启航"新质生产力赋能辽宁新时代"六地"建设大会在沈阳圆满落幕.辽宁省工业和信息化厅,省国资委,省数据局,省农业农村厅,沈阳 ...