首先,大家可以看一下我的模板
最后一行一定是规则。
其中#index#表示自动填入序号,%XXXX%其中的XXXX是和javaBean对象对应的字符串(及和get方法对应)。
然后就会将你的数据自动写入到excel中。
注意:
这里必须使用poi1.17版本1.11测试时发现缺少函数
此方法暂时只对xlsx文件有效,对xls不适用(HSSFBook缺少函数,如果要适配需要手动补充复制行,复制列的方法)
现在开始讲解我的思路:maven配置放在了最后
首先,先用模板文件初始化workbook对象
XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream("O:\\file\\数据模板.xlsx"));
然后我们需要一个获取对象属性的方法:private static String getObjectField(Object obj, String fieldKey)
这个方法的主体我放在最后
我们的思路是:每次我们获取最后一行的模板数据,并将改行copy到新的一行,然后将之前的一行数据替换成我们想要的数据,不断循环,直到将列表中的数据全部替换
public static void putRowDataToSimpleExcel(XSSFWorkbook workbook, List<Object> objects, boolean replaceNull) {
//Sheet表示excel中的一个工作表,从最低侧我们可以新建多个工作表
XSSFSheet sheet = workbook.getSheetAt(0);
//循环List数据集合
for (int i = 0; i < objects.size(); i++) {
Object object = objects.get(i);
//Row表示excel中的一行数据,这句话的含义是获取最后一行excel(有数据的)
XSSFRow modelRow = sheet.getRow(sheet.getLastRowNum());
//创建一个新的行
XSSFRow newRow = sheet.createRow(sheet.getLastRowNum() + 1);
//复制模板行到新的行
newRow.copyRowFrom(modelRow, new CellCopyPolicy());
for (Cell cell : modelRow) {//遍历单元格Cell表示单元格
//获取单元格的值
String value = cell.getStringCellValue();
//判断是否以#开头#结尾
if (value.startsWith("#") && value.endsWith("#")) {
//RULE_INDEX为自定一个的一个常量值为"#index#"
if (RULE_INDEX.equals(value)) {
//赋值到单元格中
cell.setCellValue(i);
}
//判断是否为%XXXX%的形式,%开头%结尾
} else if (value.startsWith("%") && value.endsWith("%")) {
//截取字符串获取%%中间的内容
value = value.substring(1, value.length() - 1);
//replaceNull属性表示如果object中的值为null是否将"”替换到单元格中,如果替换,则显示空白,如果不替换,则显示模板内容
if (replaceNull || StringUtils.isNoneBlank(value)) {
//获取object中的属性值,并赋值到单元格中
cell.setCellValue(getObjectField(object, value));
}
}
}
}
//删除模板行
sheet.removeRow(sheet.getRow(sheet.getLastRowNum()));
}
ok,很简单的一个小工具方法,这样我们就可以按照excel模板,生成导出数据了。
这里我给大家提供一个复杂一些,功能强大一些的函数
功能方面和上面提供的完全一样,只是该函数通过正则,可以给模板填一些元素,,,,比如序号可以表示为“第#index#个” ,这样需要就可以变成 “第1个”,“第2个”,“第3个”这样的形式,,,同样可以将多个模板字段写到同一个单元格中如“我是%name%,电话:%tell%”这样的格式
/**
* excel特点:最后一行为填充模板数据
* #index#为填充序号,从1开始
* %XXXX%为 会自动从Object中查找字段名为XXXX的属性
* 只要符合规则的数据就会替换
*
* @param workbook
* @param objects
* @param replaceNull :true 则将找不到的属性替换为空白,false 则保留模板信息
*/
public static void putRowDataToExcel(XSSFWorkbook workbook, List<Object> objects, boolean replaceNull) {
XSSFSheet sheet = workbook.getSheetAt(0);
for (int i = 0; i < objects.size(); i++) {
Object object = objects.get(i);
XSSFRow modelRow = sheet.getRow(sheet.getLastRowNum());
XSSFRow newRow = sheet.createRow(sheet.getLastRowNum() + 1);
newRow.copyRowFrom(modelRow, new CellCopyPolicy());
for (Cell cell : modelRow) {
String value = cell.getStringCellValue();
System.out.println(value);
System.out.println(value.matches("^.*?#\\w*?#.*?$"));
if (value.matches("^.*?#\\w*?#.*?$")) {
value = value.replace(RULE_INDEX, String.valueOf(i));
cell.setCellValue(value);
}
if (value.matches("^.*?%\\w*?%.*?$")) {
Pattern p = Pattern.compile("(%\\w*?%)");
Matcher matcher = p.matcher(value);
while (matcher.find()) {
String group = matcher.group();
String data = getObjectField(object, group.substring(1, group.length() - 1));
if (replaceNull || StringUtils.isNoneBlank(value)) {
value = value.replace(group, data);
}
}
cell.setCellValue(value);
}
}
}
sheet.removeRow(sheet.getRow(sheet.getLastRowNum()));
}
获取对象中的字段值
private static String getObjectField(Object obj, String fieldKey) {
try {
PropertyDescriptor property = new PropertyDescriptor(fieldKey, obj.getClass());
Method readMethod = property.getReadMethod();
return readMethod.invoke(obj).toString();
} catch (IntrospectionException e) {
System.err.println("属性没有找到:" + e.getMessage());
} catch (Exception e) {
}
return "";
}
存储excel
ps:这些都很简单,就不写注释了
public static void outputExcel(Workbook workbook) {
try {
File dir = new File(System.getProperty("java.io.tmpdir"));
dir.mkdirs();
String endName = ".xls";
if (workbook instanceof XSSFWorkbook) {
endName = ".xlsx";
}
File file = new File(dir.getAbsolutePath() + "/" + DateUUID.getUUID() + endName);
System.out.println(file.getAbsoluteFile());
OutputStream out = new FileOutputStream(file);
workbook.write(out);
out.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
测试方法
@Test
public void readExcel() throws IOException {
XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream("O:\\file\\数据模板.xlsx"));
List<Object> objects = new ArrayList<Object>();
objects.add(getModel());
objects.add(getModel());
objects.add(getModel());
objects.add(getModel());
objects.add(getModel());
objects.add(getModel());
objects.add(getModel());
objects.add(getModel());
putRowDataToExcel(workbook, objects,true);
outputExcel(workbook);
}
Model:
public class Model {
private String gardenId;
private String accountName;
private String accountId;
private String userType;
private String displayName;
private String jobId;
private String identityCard;
private String gardenName;
private Integer gender;
private String cellphone;
private String pinyin;
private String description;
private String imgUrl;
private Date createTime;
//使用状态
private String froznType;
private Date lastUpdateTime;
private String department;
}
生成Model:
public Model getModel() {
Model model = new Model();
model.setAccountId("412");
model.setDisplayName("韦慧斌");
model.setAccountName("whb");
model.setGardenId("522");
model.setDepartment("司法部-学生处");
model.setJobId("23212");
model.setGender(new Random().nextInt());
model.setLastUpdateTime(new Date());
model.setUserType("学生");
model.setIdentityCard("888888888888888888");
model.setCellphone("11111111111");
model.setFroznType("冻结");
return model;
}
maven:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-excelant</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-examples</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-contrib</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.1.0</version>
</dependency>
<dependency>
<groupId>top.whbweb.tool</groupId>
<artifactId>Tool</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>