【新增】 基于xlsx4j简单的方法
This commit is contained in:
@@ -0,0 +1,25 @@
|
||||
package pc.exam.pp.module.judgement.controller.admin.AutoWps.vo;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class WpsXlsxInfoVo {
|
||||
|
||||
// 大类名称
|
||||
private String firstName;
|
||||
|
||||
// 序号
|
||||
private String index;
|
||||
|
||||
// 方法名称
|
||||
private String function;
|
||||
|
||||
// 考点名称
|
||||
private String examName;
|
||||
|
||||
// 考点代码
|
||||
private String examCode;
|
||||
|
||||
// 方式方法
|
||||
private String method;
|
||||
}
|
@@ -1,6 +1,13 @@
|
||||
package pc.exam.pp.module.judgement.service.wps_excel;
|
||||
|
||||
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import pc.exam.pp.module.judgement.controller.admin.AutoWps.vo.WpsXlsxInfoVo;
|
||||
import pc.exam.pp.module.judgement.utils.wps_excel.xlsx4j.vo.JudgementXlsxVO;
|
||||
import pc.exam.pp.module.judgement.utils.wps_excel.xlsx4j.vo.XlsxDataInfoVO;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 判分逻辑集合(wps excel)
|
||||
*
|
||||
@@ -8,11 +15,7 @@ package pc.exam.pp.module.judgement.service.wps_excel;
|
||||
*/
|
||||
public interface JudgementWpsExcelService {
|
||||
|
||||
/**
|
||||
* 获取word文件内得考点及描述
|
||||
* @param path minio文件路径
|
||||
* @return 文件内得考点及描述
|
||||
* @throws Exception 异常
|
||||
*/
|
||||
List<JudgementXlsxVO> xlsxMaster(List<WpsXlsxInfoVo> wpsXlsxInfoVos, MultipartFile file) throws Exception;
|
||||
|
||||
List<XlsxDataInfoVO> xlsxDataInfo(MultipartFile file) throws Exception;
|
||||
}
|
||||
|
@@ -3,9 +3,26 @@ package pc.exam.pp.module.judgement.service.wps_excel;
|
||||
|
||||
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import pc.exam.pp.module.judgement.controller.admin.AutoWps.vo.WpsXlsxInfoVo;
|
||||
import pc.exam.pp.module.judgement.utils.wps_excel.xlsx4j.XlsxConversion;
|
||||
import pc.exam.pp.module.judgement.utils.wps_excel.xlsx4j.XlsxMaster;
|
||||
import pc.exam.pp.module.judgement.utils.wps_excel.xlsx4j.vo.JudgementXlsxVO;
|
||||
import pc.exam.pp.module.judgement.utils.wps_excel.xlsx4j.vo.XlsxDataInfoVO;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Service
|
||||
public class JudgementWpsExcelServiceImpl implements JudgementWpsExcelService {
|
||||
|
||||
|
||||
@Override
|
||||
public List<JudgementXlsxVO> xlsxMaster(List<WpsXlsxInfoVo> wpsXlsxInfoVos, MultipartFile file) throws Exception {
|
||||
return XlsxMaster.xlsxMaster(wpsXlsxInfoVos, file);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<XlsxDataInfoVO> xlsxDataInfo(MultipartFile file) throws Exception {
|
||||
return XlsxConversion.XlsxDataInfos(file);
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,79 @@
|
||||
package pc.exam.pp.module.judgement.utils.wps_excel.xlsx4j;
|
||||
|
||||
import org.apache.poi.openxml4j.opc.OPCPackage;
|
||||
import org.apache.poi.xssf.usermodel.XSSFSheet;
|
||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||
import org.apache.xmlbeans.XmlCursor;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import pc.exam.pp.module.judgement.utils.wps_excel.xlsx4j.vo.XlsxDataInfoVO;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
public class XlsxConversion {
|
||||
// 大纲
|
||||
// 1、获取第一层目录 幻灯片 - 母版 - 设置 - 其他
|
||||
// 2、获取第二层目录 第x页 - 幻灯片母版/备注母版 - 幻灯片设置 - 文件操作
|
||||
// 3、获取第三层目录 幻灯片设置/形状 - 幻灯片母版 - 幻灯片设置 - 文件操作
|
||||
public static List<XlsxDataInfoVO> XlsxDataInfos(MultipartFile file) throws Exception {
|
||||
List<XlsxDataInfoVO> dataInfoVOS = new ArrayList<>();
|
||||
try (InputStream inputStream = file.getInputStream();
|
||||
OPCPackage pkg = OPCPackage.open(inputStream);
|
||||
XSSFWorkbook workbook = new XSSFWorkbook(pkg)) {
|
||||
// 获取有多少个工作表
|
||||
int sheetNumber = workbook.getNumberOfSheets();
|
||||
String firstId = getStringRandom();
|
||||
setXlsxDataInfo(firstId, "", "工作表", "sheet", "", false, dataInfoVOS);
|
||||
for (int i = 0; i < sheetNumber; i++) {
|
||||
// 获取工作表内容
|
||||
XSSFSheet sheetXss = workbook.getSheetAt(i);
|
||||
String secondId = getStringRandom();
|
||||
setXlsxDataInfo(secondId, firstId, "sheet" + i + 1, "sheetInfo", "", true, dataInfoVOS);
|
||||
String thirdId = getStringRandom();
|
||||
// 常用方法
|
||||
setXlsxDataInfo(thirdId, secondId, "单元格", "cell", "", true, dataInfoVOS);
|
||||
setXlsxDataInfo(thirdId, secondId, "范围", "range", "", true, dataInfoVOS);
|
||||
setXlsxDataInfo(thirdId, secondId, "行", "row", "", true, dataInfoVOS);
|
||||
setXlsxDataInfo(thirdId, secondId, "列", "col", "", true, dataInfoVOS);
|
||||
setXlsxDataInfo(thirdId, secondId, "页面", "page", "", true, dataInfoVOS);
|
||||
setXlsxDataInfo(thirdId, secondId, "视图", "view", "", true, dataInfoVOS);
|
||||
setXlsxDataInfo(thirdId, secondId, "属性", "style", "", true, dataInfoVOS);
|
||||
// 剩余需要查询xml,特定文件存在才会显示
|
||||
}
|
||||
|
||||
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
return dataInfoVOS;
|
||||
}
|
||||
|
||||
public static String getStringRandom() {
|
||||
String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
||||
Random random = new Random();
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
// 生成指定长度的随机字符字符串
|
||||
for (int i = 0; i < 10; i++) {
|
||||
int randomIndex = random.nextInt(characters.length());
|
||||
// 随机字符
|
||||
sb.append(characters.charAt(randomIndex));
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
// 想数组中添加数据
|
||||
public static void setXlsxDataInfo(String id, String parentId, String text,
|
||||
String type, String index, boolean isTrue, List<XlsxDataInfoVO> dataInfoVOS) throws Exception {
|
||||
XlsxDataInfoVO dataInfo = new XlsxDataInfoVO();
|
||||
dataInfo.setId(id);
|
||||
dataInfo.setParentId(parentId);
|
||||
dataInfo.setName(text);
|
||||
dataInfo.setType(type);
|
||||
dataInfo.setIndex(index);
|
||||
dataInfo.setClick(isTrue);
|
||||
dataInfoVOS.add(dataInfo);
|
||||
}
|
||||
}
|
@@ -0,0 +1,85 @@
|
||||
package pc.exam.pp.module.judgement.utils.wps_excel.xlsx4j;
|
||||
|
||||
import org.docx4j.openpackaging.exceptions.Docx4JException;
|
||||
import org.docx4j.openpackaging.packages.OpcPackage;
|
||||
import org.docx4j.openpackaging.packages.PresentationMLPackage;
|
||||
import org.docx4j.openpackaging.packages.SpreadsheetMLPackage;
|
||||
import org.docx4j.openpackaging.parts.Part;
|
||||
import org.docx4j.openpackaging.parts.PresentationML.SlidePart;
|
||||
import org.docx4j.openpackaging.parts.SpreadsheetML.WorkbookPart;
|
||||
import org.docx4j.openpackaging.parts.SpreadsheetML.WorksheetPart;
|
||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet;
|
||||
import org.pptx4j.pml.GroupShape;
|
||||
import org.pptx4j.pml.Shape;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import org.xlsx4j.sml.*;
|
||||
import pc.exam.pp.module.judgement.controller.admin.AutoWps.vo.WpsXlsxInfoVo;
|
||||
import pc.exam.pp.module.judgement.utils.wps_excel.xlsx4j.vo.JudgementXlsxVO;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class XlsxMaster {
|
||||
|
||||
/**
|
||||
* 读取Xlsx属性
|
||||
* @param wpsXlsxInfoVos 考点列表
|
||||
* @param file 文件
|
||||
* @return
|
||||
* @throws IOException IO
|
||||
* @throws Docx4JException 异常
|
||||
*/
|
||||
public static List<JudgementXlsxVO> xlsxMaster(List<WpsXlsxInfoVo> wpsXlsxInfoVos, MultipartFile file) throws IOException, Docx4JException {
|
||||
List<JudgementXlsxVO> judgementXlsxVOS = new ArrayList<>();
|
||||
// 1、获取想要判断的文件地址(文件流)
|
||||
try (InputStream inputStream = file.getInputStream()) {
|
||||
// 加载 .pptx 文件
|
||||
SpreadsheetMLPackage pkg = SpreadsheetMLPackage.load(inputStream);
|
||||
WorkbookPart wb = pkg.getWorkbookPart();
|
||||
// 1) 先从 workbook 的 <sheets> 里拿到每个 sheet 的 r:id 和 name
|
||||
List<Sheet> sheets = wb.getJaxbElement().getSheets().getSheet();
|
||||
for (Sheet s : sheets) {
|
||||
String rId = s.getId(); // 关系ID
|
||||
String sheetName = s.getName();// 工作表名称
|
||||
|
||||
// 2) 用 r:id 到关系表里取真正的 WorksheetPart
|
||||
Part part = wb.getRelationshipsPart().getPart(rId);
|
||||
WorksheetPart wsp = (WorksheetPart) part;
|
||||
|
||||
System.out.println("=== Sheet: " + sheetName);
|
||||
|
||||
// 3) 读行列
|
||||
for (Row row : wsp.getJaxbElement().getSheetData().getRow()) {
|
||||
for (Cell c : row.getC()) {
|
||||
System.out.print(readCellValue(c, wb) + "\t");
|
||||
}
|
||||
System.out.println();
|
||||
}
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
return judgementXlsxVOS;
|
||||
|
||||
}
|
||||
// 读取单元格值(含共享字符串)
|
||||
private static String readCellValue(Cell cell, WorkbookPart wb) {
|
||||
if (cell.getT() == STCellType.S) { // 共享字符串
|
||||
if (wb.getSharedStrings() != null && cell.getV() != null) {
|
||||
int idx = Integer.parseInt(cell.getV());
|
||||
// 兼容富文本:取第一个 <t>
|
||||
CTRst si = wb.getSharedStrings().getJaxbElement().getSi().get(idx);
|
||||
if (si.getT() != null) return si.getT().getValue();
|
||||
if (!si.getR().isEmpty() && si.getR().get(0).getT() != null)
|
||||
return si.getR().get(0).getT().getValue();
|
||||
}
|
||||
return "";
|
||||
}
|
||||
// 其他类型:直接返回底层值(数字/日期序列号/布尔等)
|
||||
return cell.getV() == null ? "" : cell.getV();
|
||||
}
|
||||
}
|
@@ -0,0 +1,17 @@
|
||||
package pc.exam.pp.module.judgement.utils.wps_excel.xlsx4j.vo;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @author REN
|
||||
*/
|
||||
@Data
|
||||
public class JudgementXlsxVO {
|
||||
|
||||
// 考点
|
||||
private String content;
|
||||
|
||||
// 考点名称
|
||||
private String contentIn;
|
||||
|
||||
}
|
@@ -0,0 +1,19 @@
|
||||
package pc.exam.pp.module.judgement.utils.wps_excel.xlsx4j.vo;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class XlsxDataInfoVO {
|
||||
|
||||
private String name;
|
||||
|
||||
private String type;
|
||||
|
||||
private String id;
|
||||
|
||||
private String parentId;
|
||||
|
||||
private String index;
|
||||
|
||||
private boolean isClick;
|
||||
}
|
@@ -1,12 +1,10 @@
|
||||
package pc.exam.pp.module.judgement.utils.wps_pptx.pptx4j;
|
||||
|
||||
import org.docx4j.dml.chartDrawing.CTShape;
|
||||
import org.docx4j.openpackaging.exceptions.Docx4JException;
|
||||
import org.docx4j.openpackaging.packages.OpcPackage;
|
||||
import org.docx4j.openpackaging.packages.PresentationMLPackage;
|
||||
import org.docx4j.openpackaging.parts.PresentationML.SlidePart;
|
||||
import org.pptx4j.pml.GroupShape;
|
||||
import org.pptx4j.pml.Presentation;
|
||||
import org.pptx4j.pml.Shape;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import pc.exam.pp.module.judgement.utils.wps_pptx.pptx4j.vo.JudgementSlidesVO;
|
||||
|
Reference in New Issue
Block a user