EasyExcel向Excel模板文件追加写入数据,表头固定写死,数据写入成功,但中间出现了不该出现的多余空行,哪位指点一下
package com.liuchang.TestAsyncAndTransactional.demo;
import com.alibaba.excel.metadata.data.WriteCellData;
import lombok.Data;
/* 奖金发放错误模板导入数据错误提示返回 */
@Data
public class BPImportErrorWriteData implements Cloneable{
private WriteCellData<String> regionName;
private WriteCellData<String> year;
private WriteCellData<String> quarter;
private WriteCellData<String> state;
private WriteCellData<String> grantTime;
private WriteCellData<String> money;
private WriteCellData<String> reason;
}
package com.liuchang.TestAsyncAndTransactional.demo;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.data.RichTextStringData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.write.metadata.style.WriteFont;
import org.apache.poi.ss.usermodel.IndexedColors;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class WriteTemplateTest {
public static void main(String[] args) {
List<BPImportErrorWriteData> list = new ArrayList<>();
// 第1条数据
BPImportErrorWriteData bpImport = new BPImportErrorWriteData();
WriteCellData<String> writeCellData = new WriteCellData<>();
writeCellData.setType(CellDataTypeEnum.RICH_TEXT_STRING);
RichTextStringData richTextStringData = new RichTextStringData();
richTextStringData.setTextString("北海物流园");
WriteFont writeFont = new WriteFont();
writeFont.setColor(IndexedColors.RED.getIndex());
richTextStringData.applyFont(0,4,writeFont);
writeCellData.setRichTextStringDataValue(richTextStringData);
bpImport.setRegionName(writeCellData);
bpImport.setQuarter(writeCellData);
bpImport.setYear(writeCellData);
bpImport.setState(writeCellData);
bpImport.setMoney(writeCellData);
bpImport.setGrantTime(writeCellData);
bpImport.setReason(writeCellData);
list.add(bpImport);
// 第2条数据
BPImportErrorWriteData bpImport2 = new BPImportErrorWriteData();
WriteCellData<String> writeCellData2 = new WriteCellData<>();
writeCellData2.setType(CellDataTypeEnum.RICH_TEXT_STRING);
RichTextStringData richTextStringData2 = new RichTextStringData();
richTextStringData2.setTextString("炒粉物流园");
WriteFont writeFont2 = new WriteFont();
writeFont2.setColor(IndexedColors.RED.getIndex());
richTextStringData2.applyFont(writeFont2);
writeCellData2.setRichTextStringDataValue(richTextStringData2);
bpImport2.setRegionName(writeCellData2);
bpImport2.setQuarter(writeCellData2);
bpImport2.setYear(writeCellData2);
bpImport2.setState(writeCellData2);
bpImport2.setMoney(writeCellData2);
bpImport2.setGrantTime(writeCellData2);
bpImport2.setReason(writeCellData2);
list.add(bpImport2);
String filePath = "D:" + File.separator + "季度奖金导入模板.xlsx";
File templateFile = new File("F:\\WeChat\\WeChat File\\WeChat Files\\wxid_m5u7twd3yqil22\\FileStorage\\File\\2022-11\\PRD\\季度奖金发放管理导入模板.xlsx");
EasyExcel.write(filePath,BPImportErrorWriteData.class).needHead(false).inMemory(true)
.withTemplate(templateFile).sheet(0).doWrite(list);
}
}
你这种情况我遇到过,就是自己无意中点过下面某一个单元格,然后excel就算做那里不是空白了。
自己将模板文件下面的列右键删除列,就会正常。
思路:在导入的监听器中进行处理
通过反射得到对应的属性以及属性值,然后判断这些值是否为空,只要有一个不为空就判断这行数据不是空行,可以读取到集合中,但是当全为空时就不把这行数据加入集合。
参考代码:
@self
public class ExcelDataListener<T> extends AnalysisEventListener<T> {
public Map<Integer,ExcelImportSheetData<T>> sheetMap = Maps.newLinkedHashMap();
public Map<Integer,ExcelImportSheetData<T>> getDataList() {
return sheetMap;
}
@SneakyThrows
@Override
public void invoke(T data, AnalysisContext context) {
boolean exist = false;
String[] fieldName = getFieldName(data);
for(String string : fieldName){
Object fieldValue = getFieldValue(data, string);
if(fieldValue instanceof String){
if(StringUtils.isNotBlank((String)fieldValue)){
exist = true;
}
}
if(!Objects.isNull(fieldValue)){
exist = true;
}
}
if(!exist){
log.warn("该行被忽略,object={}", data);
return;
}
excelImportSheetDateFresh.addRowBean(data);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
}
/**
* 获取属性名数组
* */
public static String[] getFieldName(Object o){
Field[] fields=o.getClass().getDeclaredFields();
String[] fieldNames=new String[fields.length];
for(int i=0; i<fields.length; i++){
if(fields[i].isAnnotationPresent(ExcelProperty.class)){
fieldNames[i]=fields[i].getName();
}
}
return fieldNames;
}
/**
* 通过属性名获取属性值 忽略大小写
* @param o
* @param name
* @return
* @throws Exception
*/
public static Object getFieldValue(Object o,String name){
try {
Field[] fields = o.getClass().getDeclaredFields();
Object object = null;
for (Field field : fields) {
// 可以获取到私有属性
field.setAccessible(true);
if (field.getName().toUpperCase().equals(name.toUpperCase())) {
object = field.get(o);
break;
}
}
return object;
}catch (Exception e) {
log.warn("获取值异常,field={}", o, e);
return false;
}
}
}
不上个代码怎么指点呢
代码没问题;
是不是你的表格里面,本身那里是有空格的存在?
解决Empty row EasyExcel末尾出现非常多空白行跳过
https://blog.csdn.net/BanQIJane/article/details/122125104