【新增】 基于xlsx4j简单的方法

This commit is contained in:
dlaren
2025-08-10 11:22:58 +08:00
parent a74076a3cc
commit 410874f280
8 changed files with 251 additions and 8 deletions

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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);
}
}

View 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);
}
}

View File

@@ -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();
}
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;