public class SaxXlsxParser implements AutoCloseable { Logger logger = LoggerFactory.getLogger(SaxXlsxParser.class); private final OPCPackage opcPackage; private final ReadOnlySharedStringsTable table; /** * 临时文件 */ private final File tmp = Files.createTempFile(UUID.randomUUID().toString(), ".tmp").toFile(); /** * 存储临时文件 * @param file */ public SaxXlsxParser(MultipartFile file) throws IOException, SAXException, InvalidFormatException { file.transferTo(tmp); this.opcPackage = OPCPackage.open(tmp, PackageAccess.READ); this.table = new ReadOnlySharedStringsTable(opcPackage); } public SaxXlsxParser(File file) throws IOException, SAXException, InvalidFormatException { this.opcPackage = OPCPackage.open(file, PackageAccess.READ); this.table = new ReadOnlySharedStringsTable(opcPackage); } public SaxXlsxParser(InputStream inputStream) throws IOException, SAXException, InvalidFormatException { this.opcPackage = OPCPackage.open(inputStream); this.table = new ReadOnlySharedStringsTable(opcPackage); } /** * 扫描文件 * * @param sheetContentsHandler */ public void scan(SheetContentsHandler sheetContentsHandler) { try { XSSFReader reader = new XSSFReader(opcPackage); StylesTable styles = reader.getStylesTable(); DataFormatter dataFormatter = new DataFormatter(); XSSFSheetXMLHandler handler = new XSSFSheetXMLHandler(styles, null, table, sheetContentsHandler, dataFormatter, false); XMLReader sheetParser = SAXHelper.newXMLReader(); sheetParser.setContentHandler(handler); SheetIterator sheetIterator = (SheetIterator) reader.getSheetsData(); while (sheetIterator.hasNext()) { try (InputStream stream = sheetIterator.next()) { InputSource sheetSource = new InputSource(stream); sheetParser.parse(sheetSource); } } } catch (IOException | OpenXML4JException | SAXException | ParserConfigurationException e) { e.printStackTrace(); logger.error("",e); } } /** * 关闭资源 * * @throws Exception */ @Override public void close() throws Exception { opcPackage.close(); if (!tmp.delete()) { tmp.deleteOnExit(); } }
public abstract class AbstractHandler implements SheetContentsHandler { public static final Logger LOGGER = LoggerFactory.getLogger(AbstractHandler.class); public static final String APPEND_IMPORT_WAY = "append"; public static final String OVERRIDE_IMPORT_WAY = "override"; protected StringBuilder errorBuilder = new StringBuilder(); //当前行编号1,2,3 private int currentRowNo = -1; //某一行内容单元格列表值 private final ArrayList<String> currentRowContent; private int maxColLen = 24; private int size = 0; protected AbstractHandler() { this(20); } /** * 初始化为空 * * @param columnSize 单元格列数 */ private AbstractHandler(int columnSize) { currentRowContent = new ArrayList<>(columnSize); for (int i = 0; i < maxColLen; i++) { currentRowContent.add(null); } } /** * 每行开始 * * @param rowNum */ @Override public void startRow(int rowNum) { for (int i = 0; i < maxColLen; i++) { //每个单元格设置为空 currentRowContent.set(i, null); } size++; this.currentRowNo = rowNum; } /** * 每行结束 * * @param rowNum */ @Override public void endRow(int rowNum) { if (this.currentRowNo == rowNum) { this.handle(this.currentRowNo, currentRowContent); } } /** * 处理当前行数据 * * @param currentRow 当前行 * @param row 当前行内容 */ protected abstract void handle(int currentRow, List<String> row); /** * @param cellReference 单元格名称 * @param formattedValue 单元格里面的格式化字符串值 * @param comment 备注 */ @Override public void cell(String cellReference, String formattedValue, XSSFComment comment) { //单元格对象 CellReference reference = new CellReference(cellReference); //单元格所在行索引 int rowNum = reference.getRow(); //单元格所在列索引 int colNum = reference.getCol(); // if (this.currentRowNo == rowNum) { this.currentRowContent.set(colNum, formattedValue); } } /** * 头部 * * @param text 文本内容 * @param isHeader * @param tagName 标签名 */ @Override public void headerFooter(String text, boolean isHeader, String tagName) { } public abstract void finish(); public int getProcessedCurrentRowNo(){ return currentRowNo+1; } public int getSize(){ return size; } public void hasError(){ if(errorBuilder.length()>0) throw new RuntimeException(errorBuilder.toString()); } }}
public class PermissionHandler extends AbstractHandler { private final ResourceCache resourceCache; private final IConsumer consumer; private final Locale locale; public PermissionHandler(PermissionCacheService permissionCacheService, IConsumer consumer, Locale locale) { this.resourceCache= permissionCacheService.getResourceCache(); this.consumer = consumer; this.locale = locale; } @Override protected void handle(int currentRow, List<String> row) { if (currentRow == 0 || XlsxUtils.isEmpty(row)) { return; } String id = row.get(0); String type = toType(row.get(1)); RuleId ruleId = RuleId.valueOf(type,id); RuleId parentRuleId = resourceCache.getParentId(ruleId); if(parentRuleId==null){ throw NPException.badRequest(400,"NotFound","camera",row.get(1)); } String groupIp=parentRuleId.id; JsonObject object = new JsonObject(); object.addProperty("type",type); object.addProperty("id",id); object.addProperty("parentId",groupIp); object.addProperty("list",convertStatus(row.get(3))); object.addProperty("live",convertStatus(row.get(4))); object.addProperty("history",convertStatus(row.get(5))); object.addProperty("ptz",convertStatus(row.get(6))); object.addProperty("manualRecord",convertStatus(row.get(7))); object.addProperty("download",convertStatus(row.get(8))); consumer.consume(object); } @Override public void finish() { } private String convertStatus(String value){ if(StringUtil.isEmpty(value)) return Status.reject.name(); if(value.equals(I18nUtils.i18n(locale,"permit"))){ return Status.permit.name(); }else if(value.equals(I18nUtils.i18n(locale,"temporary"))){ return Status.temporary.name(); } return Status.reject.name(); //其他值都当做reject } public String toType(String type){ if("分组".equals(type)){ return RuleId.Type.group.name(); }else if("分组本部".equals(type)){ return RuleId.Type.self.name(); }else return RuleId.Type.resource.name(); } }