注意读取的时候与字体大小,粗细没有关系
package com.cnpc.epai.usermanagement.controller;
import com.cnpc.epai.usermanagement.StartApplication;
import com.sun.tools.internal.xjc.reader.xmlschema.bindinfo.BIConversion;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.*;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.stereotype.Controller;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.io.*;
import java.util.*;
/**
* @author
* @version 1.0.6
* @ClassName: SysPoiController
* @Description: TODO
* @date 2019-10-15 16:51
*/
@Controller
@RequestMapping("/api/sys/poi")
public class SysPoiController {
//所要读取源文件
static final String filename = "F:/A/A11.xlsx";
//用户名和邮箱相同的为一类
static final String fileNameNew = "F:/ANew/A11NewSame.xlsx";
//用户名相同,邮箱不同的为一类
static final String fileNameNotNew = "F:/ANew/A11NewNotSame.xlsx";
//组织机构不明确
static final String fileNameLostOrg = "F:/ANew/A11NewLostOrg.xlsx";
//每一行(row)未导入用户和系统中已存在用户,用户姓名不一致的
static final String fileNameNotSameName = "F:/ANew/A11NewNotSameName.xlsx";
/*
*
* @Author 李静
* @Description POI读取Excel数据 可以自动生成 .xlsx 文件
* @Date 17:02 2019-10-15
* @Param []
* @return void
**/
@RequestMapping(value = "/datagroup", method = RequestMethod.GET, produces = "application/json")
@ResponseBody
public static List<Map<String, Object>> readExcel() {
List<Map<String, Object>> list = new ArrayList<>();
FileInputStream fis = null;
// 读取Excel
Workbook wb = null;
try {
fis = new FileInputStream(filename);
wb = new XSSFWorkbook(fis);
// 使用wb。getNumberOfSheets获得sheet数目。。
// 获取sheet数目
Sheet sheet = wb.getSheetAt(0);
Row row = null;
int lastRowNum = sheet.getLastRowNum();
// 循环读取
for (int i = 0; i <= lastRowNum; i++) {
row = sheet.getRow(i);
if (row != null) {
// 获取每一列的值f放到map中
Map<String, Object> mapA = new HashMap<>();
mapA.put("用户姓名", getCellValue(row.getCell(0)).trim());
mapA.put("应用系统账号", getCellValue(row.getCell(1)).trim());
mapA.put("员工内网邮箱", getCellValue(row.getCell(2)).trim());
mapA.put("单位", getCellValue(row.getCell(3)).trim());
mapA.put("用户姓名1", getCellValue(row.getCell(4)).trim());
mapA.put("应用系统账号1", getCellValue(row.getCell(5)).trim());
mapA.put("员工内网邮箱1", getCellValue(row.getCell(6)).trim());
mapA.put("单位1", getCellValue(row.getCell(7)).trim());
mapA.put("备注", getCellValue(row.getCell(8)).trim());
mapA.put("未导入原因", getCellValue(row.getCell(9)).trim());
list.add(mapA);
}
}
wb.close();
fis.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
wb.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return list;
}
private static String getCellValue(Cell cell) {
Object result = "";
if (cell != null) {
switch (cell.getCellTypeEnum()) {
case STRING:
result = cell.getStringCellValue();
break;
case NUMERIC:
result = cell.getNumericCellValue();
break;
case BOOLEAN:
result = cell.getBooleanCellValue();
break;
case FORMULA:
result = cell.getCellFormula();
break;
case ERROR:
result = cell.getErrorCellValue();
break;
case BLANK:
result = " ";
break;
default:
break;
}
}
return result.toString();
}
/*
*
* @Author
* @Description
* flag:1 用户名和邮箱相同的为一类 可以自动生成 .xlsx 文件 A1:152 A2:480 A5:97 A8:10 A11:11
* flag:2 用户名相同,邮箱不同的为一类 可以自动生成 .xlsx 文件 A1:36 A2:610 A5:220 A8:9 A11:11
* flag:3 缺失组织机构的为一类 可以自动生成 .xlsx 文件 A1:16 A2:0 A5:0 A8:0 A11:0
* flag:4 每一行(row)未导入用户和系统中已存在用户,用户姓名不一致的(除去 组织机构不明确) 例如:(曾忠 曾 忠 这两个也算名称不一致).xlsx 文件 A1:16 A2:248 A5:41 A8:4 A11:1
* @Date 11:25 2019-10-16
* @Param [list, outputStream]
* @return void
**/
@RequestMapping(value = "/writedatagroup", method = RequestMethod.POST, produces = "application/json")
public static void writeSameExcel(String flag) {
//创建工作簿
XSSFWorkbook xssfWorkbook = null;
xssfWorkbook = new XSSFWorkbook();
//创建工作表
XSSFSheet xssfSheet;
xssfSheet = xssfWorkbook.createSheet();
xssfSheet.setColumnWidth(0,80 * 100);
xssfSheet.setColumnWidth(1,80 * 100);
xssfSheet.setColumnWidth(2,80 * 100);
xssfSheet.setColumnWidth(3,80 * 100);
xssfSheet.setColumnWidth(4,80 * 100);
xssfSheet.setColumnWidth(5,80 * 100);
xssfSheet.setColumnWidth(6,80 * 100);
xssfSheet.setColumnWidth(7,80 * 100);
xssfSheet.setColumnWidth(8,80 * 100);
xssfSheet.setColumnWidth(9,80 * 100);
//自适应列宽度
// xssfSheet.autoSizeColumn(1, true);
//创建行
XSSFRow xssfRow;
//创建列,即单元格Cell
XSSFCell xssfCell;
xssfRow = xssfSheet.createRow(0);
//第一行合并单元格
/*
说明:
1, // 起始行
1, // 结束行
0, // 起始列
2 // 结束列
*/
xssfSheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 3));
xssfSheet.addMergedRegion(new CellRangeAddress(0, 0, 4, 9));
xssfCell = xssfRow.createCell(0);
xssfCell.setCellValue("A11未导入用户");
//合并单元格之后这也不能写1 得按上面写4
XSSFCell xs = xssfRow.createCell(4);
xs.setCellValue("系统中已存在账户");
//设置第一行居中显示(表头)
XSSFCellStyle cellStyle = xssfWorkbook.createCellStyle();
cellStyle.setAlignment(HorizontalAlignment.CENTER);
xssfCell.setCellStyle(cellStyle);
xs.setCellStyle(cellStyle);
XSSFRow xRow = xssfSheet.createRow(1);
xRow.createCell(0).setCellValue("用户姓名");
xRow.createCell(1).setCellValue("应用系统账号");
xRow.createCell(2).setCellValue("员工内网邮箱");
xRow.createCell(3).setCellValue("单位");
xRow.createCell(4).setCellValue("用户姓名");
xRow.createCell(5).setCellValue("应用系统账号");
xRow.createCell(6).setCellValue("员工内网邮箱");
xRow.createCell(7).setCellValue("单位");
xRow.createCell(8).setCellValue("备注");
xRow.createCell(9).setCellValue("未导入原因");
List<Map<String, Object>> writeList = SysPoiController.readExcel();
List<Map<String, Object>> writeListSame = new ArrayList<>();
//把List里面的数据写到excel中
//根据条件归类放到list中去
//flag:1 用户名,应用系统账号,邮箱相同且都不为空的为一类 可以自动生成 .xlsx 文件 A1:147
if ("1".equals(flag)) {
writeList.stream().forEach(a -> {
if (!Objects.equals((String) a.get("用户姓名"), "A1未导入用户")
&& !Objects.equals((String) a.get("用户姓名"), "用户姓名")
&& Objects.equals((String) a.get("应用系统账号"), (String) a.get("应用系统账号1"))
&& Objects.equals((String) a.get("员工内网邮箱"), (String) a.get("员工内网邮箱1"))
&& StringUtils.isNotBlank((String) a.get("员工内网邮箱"))
&& StringUtils.isNotBlank((String) a.get("员工内网邮箱1"))
) {
writeListSame.add(a);
}
});
};
//flag:2 应用系统账相同,邮箱不同的或有一个邮箱为空的为一类 可以自动生成 .xlsx 文件 A1:30
if ("2".equals(flag)) {
writeList.stream().forEach(a -> {
if (!Objects.equals((String) a.get("用户姓名"), "A1未导入用户") && !Objects.equals((String) a.get("用户姓名"), "用户姓名")
&& Objects.equals((String) a.get("应用系统账号"), (String) a.get("应用系统账号1"))
&& !Objects.equals((String) a.get("员工内网邮箱"), (String) a.get("员工内网邮箱1"))
&& StringUtils.isNotBlank((String) a.get("员工内网邮箱"))
&& StringUtils.isNotBlank((String) a.get("员工内网邮箱1"))){
writeListSame.add(a);
}
});
};
//flag:3 缺失组织机构的为一类 可以自动生成 .xlsx 文件 A1:16
if ("3".equals(flag)){
writeList.stream().forEach(a -> {
if (Objects.equals((String)a.get("应用系统账号1"),"组织机构不明确")){
writeListSame.add(a);
}
});
}
//flag:4 除上面方式之外的 A1:50
if ("4".equals(flag)){
writeList.stream().forEach(a -> {
if (!Objects.equals((String) a.get("用户姓名"), "A1未导入用户")
&& !Objects.equals((String) a.get("用户姓名"), "用户姓名") && !Objects.equals((String)a.get("应用系统账号1"),"组织机构不明确")) {
if ( !Objects.equals((String) a.get("应用系统账号"), (String) a.get("应用系统账号1"))
|| StringUtils.isBlank((String) a.get("员工内网邮箱")) || StringUtils.isBlank((String) a.get("员工内网邮箱1"))
){
writeListSame.add(a);
}
}
});
}
for (int i = 0; i < writeListSame.size(); i++) {
//从第一行开始写入
xssfRow = xssfSheet.createRow(i+2);
//创建每个单元格Cell,即列的数据
Map<String, Object> mapNew = writeListSame.get(i);
xssfCell = xssfRow.createCell(0); //创建单元格
xssfCell.setCellValue((String) mapNew.get("用户姓名")); //设置单元格内容
xssfCell = xssfRow.createCell(1); //创建单元格
xssfCell.setCellValue((String) mapNew.get("应用系统账号")); //设置单元格内容
xssfCell = xssfRow.createCell(2); //创建单元格
xssfCell.setCellValue((String) mapNew.get("员工内网邮箱")); //设置单元格内容
xssfCell = xssfRow.createCell(3); //创建单元格
xssfCell.setCellValue((String) mapNew.get("单位")); //设置单元格内容
xssfCell = xssfRow.createCell(4); //创建单元格
xssfCell.setCellValue((String) mapNew.get("用户姓名1")); //设置单元格内容
xssfCell = xssfRow.createCell(5); //创建单元格
xssfCell.setCellValue((String) mapNew.get("应用系统账号1")); //设置单元格内容
xssfCell = xssfRow.createCell(6); //创建单元格
xssfCell.setCellValue((String) mapNew.get("员工内网邮箱1")); //设置单元格内容
xssfCell = xssfRow.createCell(7); //创建单元格
xssfCell.setCellValue((String) mapNew.get("单位1")); //设置单元格内容
xssfCell = xssfRow.createCell(8); //创建单元格
xssfCell.setCellValue((String) mapNew.get("备注")); //设置单元格内容
xssfCell = xssfRow.createCell(9); //创建单元格
xssfCell.setCellValue((String) mapNew.get("未导入原因")); //设置单元格内容
}
//新建一输出文件流
FileOutputStream fOut = null;
try {
if ("1".equals(flag)){
fOut = new FileOutputStream(fileNameNew);
};
if ("2".equals(flag)){
fOut = new FileOutputStream(fileNameNotNew);
};
if ("3".equals(flag)){
fOut = new FileOutputStream(fileNameLostOrg);
}
if ("4".equals(flag)){
fOut = new FileOutputStream(fileNameNotSameName);
}
xssfWorkbook.write(fOut);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (fOut != null) {
try {
// 把相应的Excel 工作簿存盘
fOut.flush();
// 操作结束,关闭文件
fOut.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
System.out.println("文件生成...");
}
}
虽然显示报错,但是文档生成没问题!!!!!!
{
"timestamp": "2019-10-18 14:30:13",
"status": 404,
"error": "Not Found",
"message": "No message available",
"path": "/api/sys/poi/writedatagroup"
}