123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237 |
- package cn.cslg.pas.common.utils;
- import cn.cslg.pas.common.vo.PatentData;
- import org.apache.poi.hssf.usermodel.*;
- import org.apache.poi.ooxml.POIXMLDocumentPart;
- import org.apache.poi.ss.usermodel.*;
- import org.apache.poi.xssf.usermodel.*;
- import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker;
- import org.springframework.stereotype.Service;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- /**
- * @Author xiexiang
- * @Date 2023/5/30
- */
- @Service
- public class ReadExcelUtils {
- /**
- * 检测Excel文件合法性
- *
- * @param tempFile 临时文件
- * @return 返回文件总行数
- */
- public static Integer textExcel(File tempFile, String sourceId) throws IOException {
- //判断文件是否存在
- if (!tempFile.exists() || tempFile.getPath().trim().equals("")) {
- ThrowException.throwXiaoShiException("文件上传失败,服务器忙请稍后再试!");
- }
- // 检测是否为excel文件
- String suffix = tempFile.getPath().substring(tempFile.getPath().lastIndexOf("."));
- if (!suffix.equals(".xls") && !suffix.equals(".xlsx") && !suffix.equals(".XLS") && !suffix.equals(".XLSX")) {
- //删除临时文件tempFile
- new File(tempFile.getPath()).delete();
- ThrowException.throwXiaoShiException("文件格式错误,请上传Excel文件!");
- }
- InputStream fis = new FileInputStream(tempFile);
- //使用poi框架解析处理Excel文件
- Workbook workbook = null;
- //区分不同版本Excel,使用各自对应的工具类
- if (suffix.equals(".xls") || suffix.equals(".XLS")) {
- workbook = new HSSFWorkbook(fis);
- } else if (suffix.equals(".xlsx") || suffix.equals(".XLSX")) {
- workbook = new XSSFWorkbook(fis);
- }
- //读取第几个sheet
- Sheet sheet = workbook.getSheetAt(0);
- //读取总行数
- int rows = sheet.getPhysicalNumberOfRows();
- if (rows <= 1) {
- //删除临时文件tempFile
- fis.close();
- new File(tempFile.getPath()).delete();
- ThrowException.throwXiaoShiException("文件内容格式不正确,请检查总行数是否有专利内容");
- }
- //获取第一行抬头
- Row firstRow = sheet.getRow(0);
- boolean flag1 = false; //是否有 "公开(公告)号"
- boolean flag2 = false; //是否有 "申请号"
- //遍历第一行单元格抬头,检查合法性
- String title = "", source = "";
- if (sourceId.equals("1")) {
- source = "智慧芽";
- title = "公开(公告)号";
- } else if (sourceId.equals("2")) {
- source = "合享";
- title = "公开(公告)号";
- } else {
- source = "Patentics";
- title = "公开号";
- }
- for (Cell cell : firstRow) {
- if (cell.getStringCellValue().equals(title)) {
- flag1 = true;
- }
- if (cell.getStringCellValue().equals("申请号")) {
- flag2 = true;
- }
- }
- if (!flag1 || !flag2) {
- //删除临时文件tempFile
- fis.close();
- new File(tempFile.getPath()).delete();
- ThrowException.throwXiaoShiException("文件内容格式不正确,您选择【" + source + "】来源,Excel第一行抬头必须有【" + title + "】和【申请号】");
- }
- //关闭流
- fis.close();
- //返回文件总行数-1(即专利总数量)
- return rows - 1;
- }
- /**
- * 获取一行专利的全部数据(专利内容数据 + 摘要附图)
- *
- * @param tempFile Excel临时文件
- * @param row 行数
- * @return 返回装载专利数据(专利内容数据 + 摘要附图)的对象
- */
- public static PatentData readExcelOneRow(File tempFile, Sheet sheet, int row) throws IOException {
- //创建返回最终结果的对象 patentData
- PatentData patentData = new PatentData();
- //装载专利数据(除了摘要附图)的map:(key:表头如 "公开(公告)号" value:表头对应内容如 "CN1307082B")
- Map<Object, Object> map = new HashMap<>();
- //装载摘要附图的对象
- PictureData pictureData = null;
- //开始装载专利数据
- Row firstRow = sheet.getRow(0);
- Row needRow = sheet.getRow(row);
- //获得总列数
- int columns = firstRow.getLastCellNum();
- for (int i = 0; i < columns; i++) {
- map.put(firstRow.getCell(i) + "", ExcelUtils.getValue(needRow.getCell(i)) + "");
- }
- //开始装载专利摘要附图(判断用07还是03的方法获取图片)
- String suffix = tempFile.getName().substring(tempFile.getName().lastIndexOf("."));
- if (suffix.equals(".xls") || suffix.equals(".XLS")) {
- pictureData = getPictures1((HSSFSheet) sheet, row);
- } else if (suffix.equals(".xlsx") || suffix.equals(".XLSX")) {
- pictureData = getPictures2((XSSFSheet) sheet, row);
- }
- //返回结果对象装载结果
- patentData.setMap(map);
- patentData.setPictureData(pictureData);
- return patentData;
- }
- public static Sheet readExcel(File tempFile) {
- Sheet sheet = null;
- try {
- InputStream inputStream = new FileInputStream(tempFile);
- //POI可以处理Excel文件
- Workbook workbook = null;
- //当文件以.xls结尾时
- String suffix = tempFile.getName().substring(tempFile.getName().lastIndexOf("."));
- if (suffix.equals(".xls") || suffix.equals(".XLS")) {
- workbook = new HSSFWorkbook(inputStream);
- } else if (suffix.equals(".xlsx") || suffix.equals(".XLSX")) {
- workbook = new XSSFWorkbook(inputStream);
- }
- //读取第几个sheet
- sheet = workbook.getSheetAt(0);
- //关闭流
- inputStream.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- return sheet;
- }
- /**
- * 03版本Excel取附图
- *
- * @param sheet Excel工作簿
- * @return 返回附图map
- */
- public static PictureData getPictures1(HSSFSheet sheet, Integer row) throws IOException {
- if (sheet.getDrawingPatriarch() != null) {
- List<HSSFShape> list = sheet.getDrawingPatriarch().getChildren();
- for (HSSFShape shape : list) {
- if (shape instanceof HSSFPicture) {
- HSSFPicture picture = (HSSFPicture) shape;
- HSSFClientAnchor cAnchor = (HSSFClientAnchor) picture.getAnchor();
- int row1 = cAnchor.getRow1();
- if (row1 == row) {
- return picture.getPictureData();
- }
- }
- }
- }
- return null;
- }
- /**
- * 07版本Excel取附图
- *
- * @param sheet Excel工作簿
- * @return 返回附图map
- */
- public static PictureData getPictures2(XSSFSheet sheet, Integer row) throws IOException {
- List<POIXMLDocumentPart> list = sheet.getRelations();
- for (POIXMLDocumentPart part : list) {
- if (part instanceof XSSFDrawing) {
- XSSFDrawing drawing = (XSSFDrawing) part;
- List<XSSFShape> shapes = drawing.getShapes();
- for (XSSFShape shape : shapes) {
- //解决图片空指针报错问题 lig 2021-06-03
- XSSFClientAnchor anchor = (XSSFClientAnchor) shape.getAnchor();
- //XSSFClientAnchor anchor = picture.getPreferredSize();
- CTMarker marker = anchor.getFrom();
- int excelRow = marker.getRow();
- if (excelRow == row) {
- XSSFPicture picture = (XSSFPicture) shape;
- return picture.getPictureData();
- }
- }
- }
- }
- return null;
- }
- public static String getValue(Cell cell) {
- if (cell != null) {
- if (cell.getCellType() == CellType.NUMERIC && HSSFDateUtil.isCellDateFormatted(cell)) {
- Date date = cell.getDateCellValue();
- SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
- String dateString = dateFormat.format(date);
- return dateString;
- }
- else{
- return cell.toString();
- }
- }
- return "";
- }
- }
|