From dc2854e90c8439cc5a54f6409859fd6810807b16 Mon Sep 17 00:00:00 2001 From: liuxudong08 Date: Fri, 13 Dec 2024 11:07:33 +0800 Subject: [PATCH 01/14] Add row and column indices to the doConvertToJavaObject method to provide detailed context when an error occurs. --- .../src/main/java/cn/idev/excel/util/ConverterUtils.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fastexcel-core/src/main/java/cn/idev/excel/util/ConverterUtils.java b/fastexcel-core/src/main/java/cn/idev/excel/util/ConverterUtils.java index 7a461af..b006037 100644 --- a/fastexcel-core/src/main/java/cn/idev/excel/util/ConverterUtils.java +++ b/fastexcel-core/src/main/java/cn/idev/excel/util/ConverterUtils.java @@ -174,14 +174,14 @@ private static Object doConvertToJavaObject(ReadCellData cellData, Class c } if (converter == null) { throw new ExcelDataConvertException(rowIndex, columnIndex, cellData, contentProperty, - "Converter not found, convert " + cellData.getType() + " to " + clazz.getName()); + "Error at row " + rowIndex + ", column " + columnIndex + ": Converter not found, convert " + cellData.getType() + " to " + clazz.getName()); } try { return converter.convertToJavaData(new ReadConverterContext<>(cellData, contentProperty, context)); } catch (Exception e) { throw new ExcelDataConvertException(rowIndex, columnIndex, cellData, contentProperty, - "Convert data " + cellData + " to " + clazz + " error ", e); + "Error at row " + rowIndex + ", column " + columnIndex + ": Convert data " + cellData + " to " + clazz + " error ", e); } } } From 4fb2e077b8ecd664a3390629bb3bcd934c99f353 Mon Sep 17 00:00:00 2001 From: psxjoy Date: Fri, 20 Dec 2024 23:22:43 +0800 Subject: [PATCH 02/14] feat:remove convertToPDF function --- fastexcel-core/pom.xml | 45 ----- .../main/java/cn/idev/excel/FastExcel.java | 19 -- .../fileconvertor/BaseExcelConverter.java | 172 ------------------ .../excel/fileconvertor/Excel2PdfUtils.java | 45 ----- .../excel/fileconvertor/ExcelConverter.java | 17 -- .../fileconvertor/FileConverterContext.java | 74 -------- .../excel/fileconvertor/v03/XlsConverter.java | 150 --------------- .../v03/XlsImageTableRenderer.java | 116 ------------ .../fileconvertor/v07/XlsxConverter.java | 161 ---------------- .../v07/XlsxImageTableRenderer.java | 101 ---------- 10 files changed, 900 deletions(-) delete mode 100644 fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/BaseExcelConverter.java delete mode 100644 fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/Excel2PdfUtils.java delete mode 100644 fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/ExcelConverter.java delete mode 100644 fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/FileConverterContext.java delete mode 100644 fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/v03/XlsConverter.java delete mode 100644 fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/v03/XlsImageTableRenderer.java delete mode 100644 fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/v07/XlsxConverter.java delete mode 100644 fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/v07/XlsxImageTableRenderer.java diff --git a/fastexcel-core/pom.xml b/fastexcel-core/pom.xml index 3ba486e..c026612 100644 --- a/fastexcel-core/pom.xml +++ b/fastexcel-core/pom.xml @@ -16,9 +16,6 @@ fastexcel-core ${revision} - - 7.1.15 - @@ -65,47 +62,5 @@ fastexcel-support 0.0.1 - - - com.itextpdf - itext7-core - ${itext.version} - pom - - - com.itextpdf - kernel - ${itext.version} - - - com.itextpdf - io - ${itext.version} - - - com.itextpdf - layout - ${itext.version} - - - com.itextpdf - forms - ${itext.version} - - - com.itextpdf - pdfa - ${itext.version} - - - com.itextpdf - pdftest - ${itext.version} - - - com.itextpdf - font-asian - ${itext.version} - diff --git a/fastexcel-core/src/main/java/cn/idev/excel/FastExcel.java b/fastexcel-core/src/main/java/cn/idev/excel/FastExcel.java index 08a7d5f..3859fc1 100644 --- a/fastexcel-core/src/main/java/cn/idev/excel/FastExcel.java +++ b/fastexcel-core/src/main/java/cn/idev/excel/FastExcel.java @@ -1,10 +1,5 @@ package cn.idev.excel; -import cn.idev.excel.fileconvertor.ExcelConverter; -import cn.idev.excel.fileconvertor.FileConverterContext; - -import java.io.File; - /** * This is actually {@link FastExcelFactory}, and short names look better. * @@ -12,18 +7,4 @@ */ public class FastExcel extends FastExcelFactory { - /** - * Convert excel to pdf - * - * @param excelFile excel file - * @param pdfFile pdf file - * @param fontPath font path for pdf can be null - * @param sheets sheet index to convert, if null convert all sheets - */ - public static void convertToPdf(File excelFile, File pdfFile, String fontPath, int[] sheets) { - FileConverterContext context = new FileConverterContext(excelFile, pdfFile, fontPath, sheets); - ExcelConverter excelConverter = context.getExcelConverter(); - excelConverter.convertToPdf(); - } - } diff --git a/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/BaseExcelConverter.java b/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/BaseExcelConverter.java deleted file mode 100644 index f5eba6b..0000000 --- a/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/BaseExcelConverter.java +++ /dev/null @@ -1,172 +0,0 @@ -package cn.idev.excel.fileconvertor; - -import com.itextpdf.layout.element.Table; -import com.itextpdf.layout.property.TextAlignment; -import org.apache.poi.ss.usermodel.*; -import org.apache.poi.ss.util.CellRangeAddress; - -import java.io.IOException; -import java.util.List; - -public abstract class BaseExcelConverter implements ExcelConverter { - - private final FileConverterContext context; - - public BaseExcelConverter(FileConverterContext context) { - this.context = context; - } - - @Override - public void convertToPdf() { - try { - for (int sheetIndex : context.getSheets()) { - processSheet(sheetIndex); - } - context.getDocument().close(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - private void processSheet(int sheetIndex) throws IOException { - Sheet sheet = context.getWorkbook().getSheetAt(sheetIndex); - if (sheet == null || sheet.getRow(0) == null) { - return; - } - float[] columnWidths = getColumnWidths(sheet); - Table table = new Table(columnWidths); - - addRowsToTable(table, sheet, columnWidths, context.getFontPath()); -// addPicsToTable(table, sheet); - - context.getDocument().add(table); - } - - protected abstract void addPicsToTable(Table table, Sheet sheet); - - private void addRowsToTable(Table table, Sheet sheet, float[] columnWidths, String fontPath) throws IOException { - int lastRowNum = sheet.getLastRowNum() + 1; - int lastCellNum = sheet.getRow(0).getLastCellNum(); - for (int i = 0; i < lastRowNum; i++) { - Row row = sheet.getRow(i); - addRowToTable(table, row, lastCellNum, columnWidths, fontPath); - } - } - - private void addRowToTable(Table table, Row row, int lastCellNum, float[] columnWidths, String fontPath) throws IOException { - if (row == null) { - addEmptyCells(table, lastCellNum); // 0 for empty row - return; - } - - for (int j = 0; j < lastCellNum; j++) { - Cell cell = row.getCell(j); - if (cell != null && !isCellProcessed(cell)) { -// addCellToTable(table, cell, columnWidths, fontPath); - CellRangeAddress cellRange = getCellRangeAddress(cell); - int rowspan = (cellRange != null) ? (cellRange.getLastRow() - cellRange.getFirstRow() + 1) : 1; - int colspan = (cellRange != null) ? (cellRange.getLastColumn() - cellRange.getFirstColumn() + 1) : 1; - if ((cellRange != null)) { - j = cellRange.getLastColumn(); - } - float maxWidth = (cellRange != null) ? calculateMaxWidth(columnWidths, cellRange) : columnWidths[j]; - - com.itextpdf.layout.element.Cell pdfCell = convertCell(cell, rowspan, colspan, maxWidth, fontPath); - table.addCell(pdfCell); - } else if (cell == null) { - addEmptyCell(table); - } - } - } - - private float calculateMaxWidth(float[] columnWidths, CellRangeAddress cellRange) { - float maxWidth = 0; - for (int k = cellRange.getFirstColumn(); k < cellRange.getLastColumn(); k++) { - maxWidth += columnWidths[k]; - } - return maxWidth; - } - - private void addEmptyCell(Table table) { - com.itextpdf.layout.element.Cell pdfCell = new com.itextpdf.layout.element.Cell(); - pdfCell.setBorder(com.itextpdf.layout.borders.Border.NO_BORDER); - table.addCell(pdfCell); - } - - private void addEmptyCells(Table table, int numberOfCells) { - for (int j = 0; j < numberOfCells; j++) { - addEmptyCell(table); - } - } - - protected abstract com.itextpdf.layout.element.Cell convertCell(Cell cell, int rowspan, int colspan, float maxWidth, String fontPath) throws IOException; - - public static com.itextpdf.layout.property.VerticalAlignment getVerticalAlignment(VerticalAlignment verticalAlignment) { - switch (verticalAlignment) { - case TOP: - return com.itextpdf.layout.property.VerticalAlignment.TOP; - case BOTTOM: - return com.itextpdf.layout.property.VerticalAlignment.BOTTOM; - case JUSTIFY: - case CENTER: - return com.itextpdf.layout.property.VerticalAlignment.MIDDLE; - } - return com.itextpdf.layout.property.VerticalAlignment.MIDDLE; - } - - public static TextAlignment getTextAlignment(org.apache.poi.ss.usermodel.HorizontalAlignment alignment, CellType cellType) { - switch (alignment) { - case LEFT: - return TextAlignment.LEFT; - case RIGHT: - return TextAlignment.RIGHT; - case CENTER: - return TextAlignment.CENTER; - case JUSTIFY: - return TextAlignment.JUSTIFIED; - case GENERAL: - if (cellType == CellType.NUMERIC) { - return TextAlignment.RIGHT; - } else if (cellType == CellType.BOOLEAN) { - return TextAlignment.CENTER; - } - } - return TextAlignment.LEFT; - } - - private float[] getColumnWidths(Sheet sheet) { - short lastCellNum = sheet.getRow(0).getLastCellNum(); - float[] widths = new float[lastCellNum]; - for (int i = 0; i < lastCellNum; i++) { - widths[i] = sheet.getColumnWidthInPixels(i); - } - return widths; - } - - private boolean isCellProcessed(Cell cell) { - List mergedRegions = cell.getSheet().getMergedRegions(); - int rowIndex = cell.getRowIndex(); - int columnIndex = cell.getColumnIndex(); - - for (CellRangeAddress cellAddresses : mergedRegions) { - if (cellAddresses.getFirstRow() <= rowIndex && cellAddresses.getLastRow() >= rowIndex - && cellAddresses.getFirstColumn() <= columnIndex && cellAddresses.getLastColumn() >= columnIndex) { - return !(cellAddresses.getFirstRow() == rowIndex && cellAddresses.getFirstColumn() == columnIndex); - } - } - return false; - } - - private CellRangeAddress getCellRangeAddress(Cell cell) { - List mergedRegions = cell.getSheet().getMergedRegions(); - int rowIndex = cell.getRowIndex(); - int columnIndex = cell.getColumnIndex(); - - for (CellRangeAddress cellAddresses : mergedRegions) { - if (cellAddresses.getFirstRow() == rowIndex && cellAddresses.getFirstColumn() == columnIndex) { - return cellAddresses; - } - } - return null; - } -} \ No newline at end of file diff --git a/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/Excel2PdfUtils.java b/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/Excel2PdfUtils.java deleted file mode 100644 index d490d64..0000000 --- a/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/Excel2PdfUtils.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.idev.excel.fileconvertor; - -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.CellType; -import org.apache.poi.ss.usermodel.DateUtil; -import org.apache.poi.util.LocaleUtil; - -import java.text.SimpleDateFormat; - -public class Excel2PdfUtils { - private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; // 日期格式 - private static final String TRUE_STRING = "TRUE"; - private static final String FALSE_STRING = "FALSE"; - private static final String EMPTY_STRING = ""; - - // 使用单例模式确保 SimpleDateFormat 只被创建一次 - private static final ThreadLocal DATE_FORMATTER = ThreadLocal.withInitial(() -> - new SimpleDateFormat(DATE_FORMAT, LocaleUtil.getUserLocale()) - ); - - public static String getValue(Cell cell) { - if (cell == null) { - return EMPTY_STRING; - } - - CellType cellType = cell.getCellType(); - switch (cellType) { - case BOOLEAN: - return cell.getBooleanCellValue() ? TRUE_STRING : FALSE_STRING; - case NUMERIC: - return getNumericCellValue(cell); - case STRING: - return cell.getStringCellValue(); - default: - return EMPTY_STRING; - } - } - - private static String getNumericCellValue(Cell cell) { - if (DateUtil.isCellDateFormatted(cell)) { - return DATE_FORMATTER.get().format(cell.getDateCellValue()); - } - return String.valueOf(cell.getNumericCellValue()); - } -} diff --git a/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/ExcelConverter.java b/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/ExcelConverter.java deleted file mode 100644 index f5bd14c..0000000 --- a/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/ExcelConverter.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.idev.excel.fileconvertor; - -import java.io.File; - -/** - * Excel convert to other file - * @author jipengfei - */ -public interface ExcelConverter { - - /** - * excel to pdf - * - */ - void convertToPdf(); - -} diff --git a/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/FileConverterContext.java b/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/FileConverterContext.java deleted file mode 100644 index 85854c9..0000000 --- a/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/FileConverterContext.java +++ /dev/null @@ -1,74 +0,0 @@ -package cn.idev.excel.fileconvertor; - -import cn.idev.excel.read.metadata.ReadWorkbook; -import cn.idev.excel.support.ExcelTypeEnum; -import com.itextpdf.kernel.geom.PageSize; -import com.itextpdf.kernel.pdf.PdfDocument; -import com.itextpdf.kernel.pdf.PdfWriter; -import com.itextpdf.layout.Document; -import lombok.Getter; -import lombok.Setter; -import org.apache.poi.hssf.usermodel.HSSFWorkbook; -import org.apache.poi.openxml4j.exceptions.InvalidFormatException; -import org.apache.poi.ss.usermodel.Workbook; -import org.apache.poi.xssf.usermodel.XSSFWorkbook; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; - -@Getter -@Setter -public class FileConverterContext { - - private File inputFile; - private File outputFile; - private String fontPath; - private Workbook workbook; - private Document document; - private int[] sheets; - private ExcelTypeEnum excelTypeEnum; - - public FileConverterContext(File inputFile, File outputFile, String fontPath, int[] sheets) { - try { - this.inputFile = inputFile; - this.outputFile = outputFile; - this.fontPath = fontPath; - ReadWorkbook readWorkbook = new ReadWorkbook(); - readWorkbook.setFile(inputFile); - excelTypeEnum = ExcelTypeEnum.valueOf(readWorkbook); - if (excelTypeEnum == ExcelTypeEnum.XLSX) { - this.workbook = new XSSFWorkbook(inputFile); - } else if (excelTypeEnum == ExcelTypeEnum.XLS) { - this.workbook = new HSSFWorkbook(new FileInputStream(inputFile)); - } else { - throw new IllegalArgumentException("Not supported excel type"); - } - PdfDocument pdfDocument = new PdfDocument(new PdfWriter(outputFile)); - this.document = new Document(pdfDocument, PageSize.A4.rotate()); - if (sheets == null) { - this.sheets = new int[workbook.getNumberOfSheets()]; - for (int i = 0; i < workbook.getNumberOfSheets(); i++) { - this.sheets[i] = i; - } - } else { - this.sheets = sheets; - } - } catch (IOException e) { - throw new RuntimeException(e); - } catch (InvalidFormatException e) { - throw new RuntimeException(e); - } - } - - public ExcelConverter getExcelConverter() { - if (excelTypeEnum == ExcelTypeEnum.XLSX) { - return new cn.idev.excel.fileconvertor.v07.XlsxConverter(this); - } else if (excelTypeEnum == ExcelTypeEnum.XLS) { - return new cn.idev.excel.fileconvertor.v03.XlsConverter(this); - } - throw new IllegalArgumentException("Not supported excel type"); - } - - -} diff --git a/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/v03/XlsConverter.java b/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/v03/XlsConverter.java deleted file mode 100644 index 680c339..0000000 --- a/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/v03/XlsConverter.java +++ /dev/null @@ -1,150 +0,0 @@ -package cn.idev.excel.fileconvertor.v03; - -import cn.idev.excel.fileconvertor.BaseExcelConverter; -import cn.idev.excel.fileconvertor.Excel2PdfUtils; -import cn.idev.excel.fileconvertor.FileConverterContext; -import cn.idev.excel.util.StringUtils; -import com.itextpdf.io.font.PdfEncodings; -import com.itextpdf.kernel.colors.Color; -import com.itextpdf.kernel.colors.ColorConstants; -import com.itextpdf.kernel.colors.DeviceRgb; -import com.itextpdf.kernel.font.PdfFontFactory; -import com.itextpdf.layout.borders.*; -import com.itextpdf.layout.element.*; -import com.itextpdf.layout.element.Cell; -import com.itextpdf.layout.element.Table; -import org.apache.poi.hssf.usermodel.*; -import org.apache.poi.hssf.util.HSSFColor; -import org.apache.poi.ss.usermodel.*; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -public class XlsConverter extends BaseExcelConverter { - public XlsConverter(FileConverterContext context) { - super(context); - } - - @Override - public void addPicsToTable(Table table, Sheet sheet) { - HSSFPatriarch drawingPatriarch = ((HSSFSheet) sheet).getDrawingPatriarch(); - if (drawingPatriarch != null) { - List pictures = new ArrayList<>(); - for (HSSFShape shape : drawingPatriarch.getChildren()) { - if (shape instanceof HSSFPicture) { - pictures.add((HSSFPicture) shape); - } - } - table.setNextRenderer(new XlsImageTableRenderer(table, pictures, (HSSFSheet) sheet)); - } - } - - @Override - public Cell convertCell(org.apache.poi.ss.usermodel.Cell cell, int rowspan, int colspan, float maxWidth, String fontPath) throws IOException { - String value = Excel2PdfUtils.getValue(cell); - Cell pdfCell = createPdfCell(rowspan, colspan, cell, value, maxWidth, fontPath); - - return pdfCell; - } - - private Cell createPdfCell(int rowspan, int colspan, org.apache.poi.ss.usermodel.Cell cell, String value, float maxWidth, String fontPath) throws IOException { - float cellHeight = cell.getRow().getHeightInPoints() * 1.2f; - Cell pdfCell = new Cell(rowspan, colspan) - .setHeight(cellHeight) - .setPadding(0); - Text text = new Text(value); - setPdfCellFont((HSSFCell) cell, text, fontPath); - - Paragraph paragraph = new Paragraph(text).setPadding(0f).setMargin(0f); - HSSFCellStyle cellStyle = ((HSSFCell) cell).getCellStyle(); - if (cellStyle.getWrapText()) { - paragraph.setMaxWidth(maxWidth); - } - - pdfCell.add(paragraph); - - setCellStyles(cell, pdfCell); - return pdfCell; - } - - private void setCellStyles(org.apache.poi.ss.usermodel.Cell cell, Cell pdfCell) throws IOException { - HSSFCellStyle cellStyle = ((HSSFCell) cell).getCellStyle(); - // Layout - pdfCell.setVerticalAlignment(getVerticalAlignment(cellStyle.getVerticalAlignment())); - pdfCell.setTextAlignment(getTextAlignment(cellStyle.getAlignment(), cell.getCellType())); - - // Set borders - transformBorders((HSSFCell) cell, pdfCell); - - // Set background color - setBackgroundColor(cellStyle, pdfCell, cell); - } - - private void setBackgroundColor(HSSFCellStyle cellStyle, Cell pdfCell, org.apache.poi.ss.usermodel.Cell cell) { - short colorIndex = cellStyle.getFillForegroundColor(); - HSSFWorkbook workbook = (HSSFWorkbook) cell.getSheet().getWorkbook(); - HSSFColor color = workbook.getCustomPalette().getColor(colorIndex); - if (color != null && color.getIndex() != 64) { - short[] triplet = color.getTriplet(); - int r = Math.min(triplet[0] + 32, 255); - int g = Math.min(triplet[1] + 90, 255); - int b = Math.min(triplet[2] + 60, 255); - pdfCell.setBackgroundColor(new DeviceRgb(r, g, b)); - } - } - - public static void transformBorders(HSSFCell cell, Cell pdfCell) { - HSSFCellStyle cellStyle = cell.getCellStyle(); - pdfCell.setBorderBottom(getBorder(cellStyle.getBorderBottom(), cellStyle.getBottomBorderColor(), cell)); - pdfCell.setBorderLeft(getBorder(cellStyle.getBorderLeft(), cellStyle.getLeftBorderColor(), cell)); - pdfCell.setBorderRight(getBorder(cellStyle.getBorderRight(), cellStyle.getRightBorderColor(), cell)); - pdfCell.setBorderTop(getBorder(cellStyle.getBorderTop(), cellStyle.getTopBorderColor(), cell)); - } - - private void setPdfCellFont(HSSFCell cell, Text text, String fontPath) throws IOException { - HSSFCellStyle cellStyle = cell.getCellStyle(); - HSSFFont font = cellStyle.getFont(cell.getSheet().getWorkbook()); - text.setFont(StringUtils.isEmpty(fontPath) ? PdfFontFactory.createFont() : PdfFontFactory.createFont(fontPath, PdfEncodings.IDENTITY_H)); - text.setFontSize(font.getFontHeightInPoints()); - - // Set font color - HSSFColor hssfColor = font.getHSSFColor(cell.getSheet().getWorkbook()); - if (hssfColor != null && hssfColor.getIndex() != 64) { - short[] triplet = hssfColor.getTriplet(); - text.setFontColor(new DeviceRgb(triplet[0], triplet[1], triplet[2])); - } - - // Set font styles - if (font.getBold()) text.setBold(); - if (font.getItalic()) text.setItalic(); - if (font.getUnderline() == 1) text.setUnderline(0.5f, -1f); - } - - public static Border getBorder(BorderStyle borderStyle, short colorIndex, HSSFCell cell) { - HSSFPalette customPalette = cell.getSheet().getWorkbook().getCustomPalette(); - HSSFColor color = customPalette.getColor(colorIndex); - Color defaultColor = (color != null && color.getIndex() != 64) - ? new DeviceRgb(color.getTriplet()[0], color.getTriplet()[1], color.getTriplet()[2]) - : ColorConstants.BLACK; - - switch (borderStyle) { - case THIN: - return new SolidBorder(defaultColor, 0.3f); - case MEDIUM: - return new SolidBorder(defaultColor, 0.5f); - case DASHED: - return new DashedBorder(defaultColor, 0.3f); - case DOTTED: - return new DottedBorder(defaultColor, 0.3f); - case THICK: - return new SolidBorder(defaultColor, 1f); - case DOUBLE: - return new DoubleBorder(defaultColor, 0.3f); - case MEDIUM_DASHED: - return new DashedBorder(defaultColor, 0.5f); - default: - return Border.NO_BORDER; - } - } -} diff --git a/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/v03/XlsImageTableRenderer.java b/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/v03/XlsImageTableRenderer.java deleted file mode 100644 index a77094b..0000000 --- a/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/v03/XlsImageTableRenderer.java +++ /dev/null @@ -1,116 +0,0 @@ -package cn.idev.excel.fileconvertor.v03; - -import com.itextpdf.io.image.ImageData; -import com.itextpdf.io.image.ImageDataFactory; -import com.itextpdf.kernel.geom.Rectangle; -import com.itextpdf.layout.element.Table; -import com.itextpdf.layout.renderer.CellRenderer; -import com.itextpdf.layout.renderer.DrawContext; -import com.itextpdf.layout.renderer.IRenderer; -import com.itextpdf.layout.renderer.TableRenderer; -import org.apache.poi.hssf.usermodel.HSSFClientAnchor; -import org.apache.poi.hssf.usermodel.HSSFPicture; -import org.apache.poi.hssf.usermodel.HSSFSheet; - -import java.util.List; - -/** - * Renders images from an Excel sheet onto a PDF table. - */ -public class XlsImageTableRenderer extends TableRenderer { - private List hSSFPictures; - private HSSFSheet sheet; - - public XlsImageTableRenderer(Table modelElement, List hSSFPictures, HSSFSheet sheet) { - super(modelElement); - this.hSSFPictures = hSSFPictures; - this.sheet = sheet; - } - - @Override - public void drawChildren(DrawContext drawContext) { - super.drawChildren(drawContext); - drawExcelImages(drawContext); - } - - private void drawExcelImages(DrawContext drawContext) { - for (HSSFPicture picture : hSSFPictures) { - HSSFClientAnchor clientAnchor = picture.getClientAnchor(); - Rectangle imageRect = calculateImageRectangle(clientAnchor); - ImageData imageData = ImageDataFactory.create(picture.getPictureData().getData()); - drawContext.getCanvas().addImage(imageData, - imageRect.getWidth(), - 0, - 0, - imageRect.getHeight(), - imageRect.getLeft(), - imageRect.getTop()); - } - } - - private Rectangle calculateImageRectangle(HSSFClientAnchor clientAnchor) { - CellRenderer cellRenderer1 = rows.get(clientAnchor.getRow1())[clientAnchor.getCol1()]; - Rectangle rect1 = cellRenderer1.getOccupiedAreaBBox(); - - CellRenderer cellRenderer2 = rows.get(clientAnchor.getRow2())[clientAnchor.getCol2()]; - Rectangle rect2 = cellRenderer2.getOccupiedAreaBBox(); - - float widthRate = calculateWidthRate(rect2); - float heightRate = calculateHeightRate(rect2); - - float width = calculateImageWidth(clientAnchor, widthRate); - float height = calculateImageHeight(clientAnchor, heightRate); - - float x = rect1.getLeft() + clientAnchor.getDx1() * widthRate; - float y = rect1.getTop() - height - clientAnchor.getDy1() * heightRate; - - return new Rectangle(x, y, width, height); - } - - private float calculateWidthRate(Rectangle rect2) { - return (super.getOccupiedAreaBBox().getWidth() + rect2.getWidth()) / getExcelWidth(sheet); - } - - private float calculateHeightRate(Rectangle rect2) { - return (super.getOccupiedAreaBBox().getHeight() - rect2.getHeight()) / getExcelHeight(sheet); - } - - private float calculateImageWidth(HSSFClientAnchor clientAnchor, float widthRate) { - float width = 0f; - for (int j = clientAnchor.getCol1(); j < clientAnchor.getCol2(); j++) { - width += sheet.getColumnWidth(j); - } - return Math.abs(width - clientAnchor.getDx1() + clientAnchor.getDx2()) * widthRate; - } - - private float calculateImageHeight(HSSFClientAnchor clientAnchor, float heightRate) { - float height = 0f; - for (int j = clientAnchor.getRow1(); j < clientAnchor.getRow2(); j++) { - height += sheet.getRow(j).getHeight(); - } - return Math.abs(height - clientAnchor.getDy1() + clientAnchor.getDy2()) * heightRate; - } - - private float getExcelHeight(HSSFSheet sheet) { - int physicalNumberOfRows = sheet.getPhysicalNumberOfRows(); - float result = 0; - for (int i = 0; i < physicalNumberOfRows; i++) { - result += sheet.getRow(i).getHeight(); - } - return result; - } - - private float getExcelWidth(HSSFSheet sheet) { - short lastCellNum = sheet.getRow(0).getLastCellNum(); - float result = 0; - for (int i = 0; i < lastCellNum; i++) { - result += sheet.getColumnWidth(i); - } - return result; - } - - @Override - public IRenderer getNextRenderer() { - return new XlsImageTableRenderer((Table) modelElement, hSSFPictures, sheet); - } -} diff --git a/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/v07/XlsxConverter.java b/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/v07/XlsxConverter.java deleted file mode 100644 index 8ab1bbc..0000000 --- a/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/v07/XlsxConverter.java +++ /dev/null @@ -1,161 +0,0 @@ -package cn.idev.excel.fileconvertor.v07; - -import cn.idev.excel.fileconvertor.BaseExcelConverter; -import cn.idev.excel.fileconvertor.Excel2PdfUtils; -import cn.idev.excel.fileconvertor.FileConverterContext; -import cn.idev.excel.util.StringUtils; -import com.itextpdf.io.font.PdfEncodings; -import com.itextpdf.kernel.colors.DeviceRgb; -import com.itextpdf.kernel.font.PdfFontFactory; -import com.itextpdf.layout.borders.*; -import com.itextpdf.layout.element.Paragraph; -import com.itextpdf.layout.element.Table; -import com.itextpdf.layout.element.Text; -import org.apache.poi.ss.usermodel.*; -import org.apache.poi.xssf.usermodel.*; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -public class XlsxConverter extends BaseExcelConverter { - private static final String DEFAULT_FONT_PATH = System.getProperty("user.dir") + "/doc/font/SimHei.TTF"; - - public XlsxConverter(FileConverterContext context) { - super(context); - } - - @Override - public void addPicsToTable(Table table, Sheet sheet) { - XSSFDrawing drawing = (XSSFDrawing) sheet.createDrawingPatriarch(); - if (drawing != null) { - List pictures = new ArrayList<>(); - for (XSSFShape shape : drawing.getShapes()) { - if (shape instanceof XSSFPicture) { - pictures.add((XSSFPicture) shape); - } - } - table.setNextRenderer(new XlsxImageTableRenderer(table, pictures, (XSSFSheet) sheet)); - } - } - - @Override - public com.itextpdf.layout.element.Cell convertCell(Cell cell, int rowspan, int colspan, float maxWidth, String fontPath) throws IOException { - String value = Excel2PdfUtils.getValue(cell); - com.itextpdf.layout.element.Cell pdfCell = createPdfCell(rowspan, colspan, cell, value, maxWidth, fontPath); - return pdfCell; - } - - public static void transformBorder(XSSFCell cell, com.itextpdf.layout.element.Cell pdfCell) { - XSSFCellStyle cellStyle = cell.getCellStyle(); - BorderStyle borderBottom = cellStyle.getBorderBottom(); - pdfCell.setBorderBottom(getBorder(borderBottom, cellStyle.getBottomBorderXSSFColor())); - - BorderStyle borderLeft = cellStyle.getBorderLeft(); - pdfCell.setBorderLeft(getBorder(borderLeft, cellStyle.getLeftBorderXSSFColor())); - - BorderStyle borderRight = cellStyle.getBorderRight(); - pdfCell.setBorderRight(getBorder(borderRight, cellStyle.getRightBorderXSSFColor())); - - BorderStyle borderTop = cellStyle.getBorderTop(); - pdfCell.setBorderTop(getBorder(borderTop, cellStyle.getTopBorderXSSFColor())); - } - - private com.itextpdf.layout.element.Cell createPdfCell(int rowspan, int colspan, Cell cell, String value, float maxWidth, String fontPath) throws IOException { - com.itextpdf.layout.element.Cell pdfCell = new com.itextpdf.layout.element.Cell(rowspan, colspan) - .setHeight(cell.getRow().getHeightInPoints() * 1.2f) - .setPadding(0); - Text text = new Text(value); - setPdfCellFont((XSSFCell) cell, text, fontPath); - Paragraph paragraph = new Paragraph(text).setPadding(0f).setMargin(0f); - XSSFCellStyle cellStyle = ((XSSFCell) cell).getCellStyle(); - if (cellStyle.getWrapText()) { - paragraph.setMaxWidth(maxWidth); - } - pdfCell.add(paragraph); - setCellStyles((XSSFCell)cell, pdfCell); - return pdfCell; - } - - private void setCellStyles( XSSFCell cell,com.itextpdf.layout.element.Cell pdfCell) throws IOException { - XSSFCellStyle cellStyle = cell.getCellStyle(); - pdfCell.setVerticalAlignment(getVerticalAlignment(cellStyle.getVerticalAlignment())) - .setTextAlignment(getTextAlignment(cellStyle.getAlignment(), cell.getCellType())); - - // Set borders and background color - setBorders(pdfCell, cellStyle); - setBackgroundColor(pdfCell, cellStyle); - } - - private void setBorders(com.itextpdf.layout.element.Cell pdfCell, XSSFCellStyle cellStyle) { - pdfCell.setBorderBottom(getBorder(cellStyle.getBorderBottom(), cellStyle.getBottomBorderXSSFColor())); - pdfCell.setBorderLeft(getBorder(cellStyle.getBorderLeft(), cellStyle.getLeftBorderXSSFColor())); - pdfCell.setBorderRight(getBorder(cellStyle.getBorderRight(), cellStyle.getRightBorderXSSFColor())); - pdfCell.setBorderTop(getBorder(cellStyle.getBorderTop(), cellStyle.getTopBorderXSSFColor())); - } - - private void setBackgroundColor(com.itextpdf.layout.element.Cell pdfCell, XSSFCellStyle cellStyle) { - XSSFColor fillColor = cellStyle.getFillForegroundXSSFColor(); - if (fillColor != null) { - byte[] rgb = fillColor.getRGB(); - if (rgb != null) { - pdfCell.setBackgroundColor(new DeviceRgb(Byte.toUnsignedInt(rgb[0]), Byte.toUnsignedInt(rgb[1]), Byte.toUnsignedInt(rgb[2]))); - } - } - } - - private void setPdfCellFont(XSSFCell cell, Text text,String fontPath) throws IOException { - XSSFCellStyle cellStyle = cell.getCellStyle(); - short fontHeight = cellStyle.getFont().getFontHeightInPoints(); - cellStyle.getFont().getFontName(); - text.setFont(StringUtils.isEmpty(fontPath) ? PdfFontFactory.createFont() : PdfFontFactory.createFont(fontPath, PdfEncodings.IDENTITY_H)); - text.setFontSize(fontHeight); - setFontColor(cellStyle.getFont(), text); - setFontStyles(cell.getCellStyle().getFont(), text); - } - - private void setFontColor(XSSFFont font, Text text) { - XSSFColor xssfColor = font.getXSSFColor(); - if (xssfColor != null && xssfColor.getIndex() != 64) { - byte[] rgb = xssfColor.getRGB(); - if (rgb != null) { - text.setFontColor(new DeviceRgb(Byte.toUnsignedInt(rgb[0]), Byte.toUnsignedInt(rgb[1]), Byte.toUnsignedInt(rgb[2]))); - } - } - } - - private void setFontStyles(XSSFFont font, Text text) { - if (font.getBold()) text.setBold(); - if (font.getItalic()) text.setItalic(); - if (font.getUnderline() == 1) text.setUnderline(0.5f, -1f); - } - - public static com.itextpdf.layout.borders.Border getBorder(BorderStyle borderStyle, XSSFColor xSSFColor) { - DeviceRgb defaultColor = new DeviceRgb(0, 0, 0); // Default to black - if (xSSFColor != null) { - byte[] rgb = xSSFColor.getRGB(); - if (rgb != null) { - defaultColor = new DeviceRgb(Byte.toUnsignedInt(rgb[0]), Byte.toUnsignedInt(rgb[1]), Byte.toUnsignedInt(rgb[2])); - } - } - - switch (borderStyle) { - case THIN: - return new SolidBorder(defaultColor, 0.3f); - case MEDIUM: - return new SolidBorder(defaultColor, 0.5f); - case DASHED: - return new DashedBorder(defaultColor, 0.3f); - case DOTTED: - return new DottedBorder(defaultColor, 0.3f); - case THICK: - return new SolidBorder(defaultColor, 1f); - case DOUBLE: - return new DoubleBorder(defaultColor, 0.3f); - case MEDIUM_DASHED: - return new DashedBorder(defaultColor, 0.5f); - default: - return Border.NO_BORDER; - } - } -} \ No newline at end of file diff --git a/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/v07/XlsxImageTableRenderer.java b/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/v07/XlsxImageTableRenderer.java deleted file mode 100644 index 017704b..0000000 --- a/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/v07/XlsxImageTableRenderer.java +++ /dev/null @@ -1,101 +0,0 @@ -package cn.idev.excel.fileconvertor.v07; - -import com.itextpdf.io.image.ImageData; -import com.itextpdf.io.image.ImageDataFactory; -import com.itextpdf.kernel.geom.Rectangle; -import com.itextpdf.layout.element.Table; -import com.itextpdf.layout.renderer.CellRenderer; -import com.itextpdf.layout.renderer.DrawContext; -import com.itextpdf.layout.renderer.IRenderer; -import com.itextpdf.layout.renderer.TableRenderer; -import org.apache.poi.xssf.usermodel.XSSFClientAnchor; -import org.apache.poi.xssf.usermodel.XSSFPicture; -import org.apache.poi.xssf.usermodel.XSSFSheet; - -import java.util.List; - -/** - * Renders images from an Excel sheet onto a PDF table. - */ -public class XlsxImageTableRenderer extends TableRenderer { - private List xssfPictures; - private XSSFSheet sheet; - - public XlsxImageTableRenderer(Table modelElement, List xssfPictures, XSSFSheet sheet) { - super(modelElement); - this.xssfPictures = xssfPictures; - this.sheet = sheet; - } - - @Override - public void drawChildren(DrawContext drawContext) { - super.drawChildren(drawContext); - renderExcelImages(drawContext); - } - - private void renderExcelImages(DrawContext drawContext) { - for (XSSFPicture picture : xssfPictures) { - XSSFClientAnchor clientAnchor = picture.getClientAnchor(); - Rectangle imageRect = calculateImageRectangle(clientAnchor); - ImageData imageData = ImageDataFactory.create(picture.getPictureData().getData()); - drawContext.getCanvas().addImage(imageData, - imageRect.getWidth(), - 0, - 0, - imageRect.getHeight(), - imageRect.getLeft(), - imageRect.getTop()); - } - } - - private Rectangle calculateImageRectangle(XSSFClientAnchor clientAnchor) { - CellRenderer cellRenderer1 = rows.get(clientAnchor.getRow1())[clientAnchor.getCol1()]; - CellRenderer cellRenderer2 = rows.get(clientAnchor.getRow2())[clientAnchor.getCol2()]; - Rectangle rect1 = cellRenderer1.getOccupiedAreaBBox(); - Rectangle rect2 = cellRenderer2.getOccupiedAreaBBox(); - - float widthRate = (super.getOccupiedAreaBBox().getWidth() + rect2.getWidth()) / getExcelWidth(sheet); - float heightRate = (super.getOccupiedAreaBBox().getHeight() - rect2.getHeight()) / getExcelHeight(sheet); - - float width = calculateImageWidth(clientAnchor, widthRate); - float height = calculateImageHeight(clientAnchor, heightRate); - - float x = rect1.getLeft() + clientAnchor.getDx1() * widthRate; - float y = rect1.getTop() - height - clientAnchor.getDy1() * heightRate; - - return new Rectangle(x, y, width, height); - } - - private float calculateImageWidth(XSSFClientAnchor clientAnchor, float widthRate) { - float width = 0f; - for (int j = clientAnchor.getCol1(); j < clientAnchor.getCol2(); j++) { - width += sheet.getColumnWidth(j); - } - return Math.abs(width - clientAnchor.getDx1() + clientAnchor.getDx2()) * widthRate; - } - - private float calculateImageHeight(XSSFClientAnchor clientAnchor, float heightRate) { - float height = 0f; - for (int j = clientAnchor.getRow1(); j < clientAnchor.getRow2(); j++) { - height += sheet.getRow(j).getHeight(); - } - return Math.abs(height - clientAnchor.getDy1() + clientAnchor.getDy2()) * heightRate; - } - - private float getExcelHeight(XSSFSheet sheet) { - float totalHeight = 0; - for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) { - totalHeight += sheet.getRow(i).getHeight(); - } - return totalHeight; - } - - private float getExcelWidth(XSSFSheet sheet) { - return (short)sheet.getRow(0).getLastCellNum() * sheet.getColumnWidth(0); - } - - @Override - public IRenderer getNextRenderer() { - return new XlsxImageTableRenderer((Table) modelElement, xssfPictures, sheet); - } -} From 8fcd0ff6d9f06dcf72474a8fb2bd0e811ef96201 Mon Sep 17 00:00:00 2001 From: psxjoy Date: Fri, 20 Dec 2024 23:22:43 +0800 Subject: [PATCH 03/14] feat:remove convertToPDF function --- fastexcel-core/pom.xml | 45 ----- .../main/java/cn/idev/excel/FastExcel.java | 19 -- .../fileconvertor/BaseExcelConverter.java | 172 ------------------ .../excel/fileconvertor/Excel2PdfUtils.java | 45 ----- .../excel/fileconvertor/ExcelConverter.java | 17 -- .../fileconvertor/FileConverterContext.java | 74 -------- .../excel/fileconvertor/v03/XlsConverter.java | 150 --------------- .../v03/XlsImageTableRenderer.java | 116 ------------ .../fileconvertor/v07/XlsxConverter.java | 161 ---------------- .../v07/XlsxImageTableRenderer.java | 101 ---------- 10 files changed, 900 deletions(-) delete mode 100644 fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/BaseExcelConverter.java delete mode 100644 fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/Excel2PdfUtils.java delete mode 100644 fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/ExcelConverter.java delete mode 100644 fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/FileConverterContext.java delete mode 100644 fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/v03/XlsConverter.java delete mode 100644 fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/v03/XlsImageTableRenderer.java delete mode 100644 fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/v07/XlsxConverter.java delete mode 100644 fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/v07/XlsxImageTableRenderer.java diff --git a/fastexcel-core/pom.xml b/fastexcel-core/pom.xml index 3ba486e..c026612 100644 --- a/fastexcel-core/pom.xml +++ b/fastexcel-core/pom.xml @@ -16,9 +16,6 @@ fastexcel-core ${revision} - - 7.1.15 - @@ -65,47 +62,5 @@ fastexcel-support 0.0.1 - - - com.itextpdf - itext7-core - ${itext.version} - pom - - - com.itextpdf - kernel - ${itext.version} - - - com.itextpdf - io - ${itext.version} - - - com.itextpdf - layout - ${itext.version} - - - com.itextpdf - forms - ${itext.version} - - - com.itextpdf - pdfa - ${itext.version} - - - com.itextpdf - pdftest - ${itext.version} - - - com.itextpdf - font-asian - ${itext.version} - diff --git a/fastexcel-core/src/main/java/cn/idev/excel/FastExcel.java b/fastexcel-core/src/main/java/cn/idev/excel/FastExcel.java index 08a7d5f..3859fc1 100644 --- a/fastexcel-core/src/main/java/cn/idev/excel/FastExcel.java +++ b/fastexcel-core/src/main/java/cn/idev/excel/FastExcel.java @@ -1,10 +1,5 @@ package cn.idev.excel; -import cn.idev.excel.fileconvertor.ExcelConverter; -import cn.idev.excel.fileconvertor.FileConverterContext; - -import java.io.File; - /** * This is actually {@link FastExcelFactory}, and short names look better. * @@ -12,18 +7,4 @@ */ public class FastExcel extends FastExcelFactory { - /** - * Convert excel to pdf - * - * @param excelFile excel file - * @param pdfFile pdf file - * @param fontPath font path for pdf can be null - * @param sheets sheet index to convert, if null convert all sheets - */ - public static void convertToPdf(File excelFile, File pdfFile, String fontPath, int[] sheets) { - FileConverterContext context = new FileConverterContext(excelFile, pdfFile, fontPath, sheets); - ExcelConverter excelConverter = context.getExcelConverter(); - excelConverter.convertToPdf(); - } - } diff --git a/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/BaseExcelConverter.java b/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/BaseExcelConverter.java deleted file mode 100644 index f5eba6b..0000000 --- a/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/BaseExcelConverter.java +++ /dev/null @@ -1,172 +0,0 @@ -package cn.idev.excel.fileconvertor; - -import com.itextpdf.layout.element.Table; -import com.itextpdf.layout.property.TextAlignment; -import org.apache.poi.ss.usermodel.*; -import org.apache.poi.ss.util.CellRangeAddress; - -import java.io.IOException; -import java.util.List; - -public abstract class BaseExcelConverter implements ExcelConverter { - - private final FileConverterContext context; - - public BaseExcelConverter(FileConverterContext context) { - this.context = context; - } - - @Override - public void convertToPdf() { - try { - for (int sheetIndex : context.getSheets()) { - processSheet(sheetIndex); - } - context.getDocument().close(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - private void processSheet(int sheetIndex) throws IOException { - Sheet sheet = context.getWorkbook().getSheetAt(sheetIndex); - if (sheet == null || sheet.getRow(0) == null) { - return; - } - float[] columnWidths = getColumnWidths(sheet); - Table table = new Table(columnWidths); - - addRowsToTable(table, sheet, columnWidths, context.getFontPath()); -// addPicsToTable(table, sheet); - - context.getDocument().add(table); - } - - protected abstract void addPicsToTable(Table table, Sheet sheet); - - private void addRowsToTable(Table table, Sheet sheet, float[] columnWidths, String fontPath) throws IOException { - int lastRowNum = sheet.getLastRowNum() + 1; - int lastCellNum = sheet.getRow(0).getLastCellNum(); - for (int i = 0; i < lastRowNum; i++) { - Row row = sheet.getRow(i); - addRowToTable(table, row, lastCellNum, columnWidths, fontPath); - } - } - - private void addRowToTable(Table table, Row row, int lastCellNum, float[] columnWidths, String fontPath) throws IOException { - if (row == null) { - addEmptyCells(table, lastCellNum); // 0 for empty row - return; - } - - for (int j = 0; j < lastCellNum; j++) { - Cell cell = row.getCell(j); - if (cell != null && !isCellProcessed(cell)) { -// addCellToTable(table, cell, columnWidths, fontPath); - CellRangeAddress cellRange = getCellRangeAddress(cell); - int rowspan = (cellRange != null) ? (cellRange.getLastRow() - cellRange.getFirstRow() + 1) : 1; - int colspan = (cellRange != null) ? (cellRange.getLastColumn() - cellRange.getFirstColumn() + 1) : 1; - if ((cellRange != null)) { - j = cellRange.getLastColumn(); - } - float maxWidth = (cellRange != null) ? calculateMaxWidth(columnWidths, cellRange) : columnWidths[j]; - - com.itextpdf.layout.element.Cell pdfCell = convertCell(cell, rowspan, colspan, maxWidth, fontPath); - table.addCell(pdfCell); - } else if (cell == null) { - addEmptyCell(table); - } - } - } - - private float calculateMaxWidth(float[] columnWidths, CellRangeAddress cellRange) { - float maxWidth = 0; - for (int k = cellRange.getFirstColumn(); k < cellRange.getLastColumn(); k++) { - maxWidth += columnWidths[k]; - } - return maxWidth; - } - - private void addEmptyCell(Table table) { - com.itextpdf.layout.element.Cell pdfCell = new com.itextpdf.layout.element.Cell(); - pdfCell.setBorder(com.itextpdf.layout.borders.Border.NO_BORDER); - table.addCell(pdfCell); - } - - private void addEmptyCells(Table table, int numberOfCells) { - for (int j = 0; j < numberOfCells; j++) { - addEmptyCell(table); - } - } - - protected abstract com.itextpdf.layout.element.Cell convertCell(Cell cell, int rowspan, int colspan, float maxWidth, String fontPath) throws IOException; - - public static com.itextpdf.layout.property.VerticalAlignment getVerticalAlignment(VerticalAlignment verticalAlignment) { - switch (verticalAlignment) { - case TOP: - return com.itextpdf.layout.property.VerticalAlignment.TOP; - case BOTTOM: - return com.itextpdf.layout.property.VerticalAlignment.BOTTOM; - case JUSTIFY: - case CENTER: - return com.itextpdf.layout.property.VerticalAlignment.MIDDLE; - } - return com.itextpdf.layout.property.VerticalAlignment.MIDDLE; - } - - public static TextAlignment getTextAlignment(org.apache.poi.ss.usermodel.HorizontalAlignment alignment, CellType cellType) { - switch (alignment) { - case LEFT: - return TextAlignment.LEFT; - case RIGHT: - return TextAlignment.RIGHT; - case CENTER: - return TextAlignment.CENTER; - case JUSTIFY: - return TextAlignment.JUSTIFIED; - case GENERAL: - if (cellType == CellType.NUMERIC) { - return TextAlignment.RIGHT; - } else if (cellType == CellType.BOOLEAN) { - return TextAlignment.CENTER; - } - } - return TextAlignment.LEFT; - } - - private float[] getColumnWidths(Sheet sheet) { - short lastCellNum = sheet.getRow(0).getLastCellNum(); - float[] widths = new float[lastCellNum]; - for (int i = 0; i < lastCellNum; i++) { - widths[i] = sheet.getColumnWidthInPixels(i); - } - return widths; - } - - private boolean isCellProcessed(Cell cell) { - List mergedRegions = cell.getSheet().getMergedRegions(); - int rowIndex = cell.getRowIndex(); - int columnIndex = cell.getColumnIndex(); - - for (CellRangeAddress cellAddresses : mergedRegions) { - if (cellAddresses.getFirstRow() <= rowIndex && cellAddresses.getLastRow() >= rowIndex - && cellAddresses.getFirstColumn() <= columnIndex && cellAddresses.getLastColumn() >= columnIndex) { - return !(cellAddresses.getFirstRow() == rowIndex && cellAddresses.getFirstColumn() == columnIndex); - } - } - return false; - } - - private CellRangeAddress getCellRangeAddress(Cell cell) { - List mergedRegions = cell.getSheet().getMergedRegions(); - int rowIndex = cell.getRowIndex(); - int columnIndex = cell.getColumnIndex(); - - for (CellRangeAddress cellAddresses : mergedRegions) { - if (cellAddresses.getFirstRow() == rowIndex && cellAddresses.getFirstColumn() == columnIndex) { - return cellAddresses; - } - } - return null; - } -} \ No newline at end of file diff --git a/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/Excel2PdfUtils.java b/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/Excel2PdfUtils.java deleted file mode 100644 index d490d64..0000000 --- a/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/Excel2PdfUtils.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.idev.excel.fileconvertor; - -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.CellType; -import org.apache.poi.ss.usermodel.DateUtil; -import org.apache.poi.util.LocaleUtil; - -import java.text.SimpleDateFormat; - -public class Excel2PdfUtils { - private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; // 日期格式 - private static final String TRUE_STRING = "TRUE"; - private static final String FALSE_STRING = "FALSE"; - private static final String EMPTY_STRING = ""; - - // 使用单例模式确保 SimpleDateFormat 只被创建一次 - private static final ThreadLocal DATE_FORMATTER = ThreadLocal.withInitial(() -> - new SimpleDateFormat(DATE_FORMAT, LocaleUtil.getUserLocale()) - ); - - public static String getValue(Cell cell) { - if (cell == null) { - return EMPTY_STRING; - } - - CellType cellType = cell.getCellType(); - switch (cellType) { - case BOOLEAN: - return cell.getBooleanCellValue() ? TRUE_STRING : FALSE_STRING; - case NUMERIC: - return getNumericCellValue(cell); - case STRING: - return cell.getStringCellValue(); - default: - return EMPTY_STRING; - } - } - - private static String getNumericCellValue(Cell cell) { - if (DateUtil.isCellDateFormatted(cell)) { - return DATE_FORMATTER.get().format(cell.getDateCellValue()); - } - return String.valueOf(cell.getNumericCellValue()); - } -} diff --git a/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/ExcelConverter.java b/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/ExcelConverter.java deleted file mode 100644 index f5bd14c..0000000 --- a/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/ExcelConverter.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.idev.excel.fileconvertor; - -import java.io.File; - -/** - * Excel convert to other file - * @author jipengfei - */ -public interface ExcelConverter { - - /** - * excel to pdf - * - */ - void convertToPdf(); - -} diff --git a/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/FileConverterContext.java b/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/FileConverterContext.java deleted file mode 100644 index 85854c9..0000000 --- a/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/FileConverterContext.java +++ /dev/null @@ -1,74 +0,0 @@ -package cn.idev.excel.fileconvertor; - -import cn.idev.excel.read.metadata.ReadWorkbook; -import cn.idev.excel.support.ExcelTypeEnum; -import com.itextpdf.kernel.geom.PageSize; -import com.itextpdf.kernel.pdf.PdfDocument; -import com.itextpdf.kernel.pdf.PdfWriter; -import com.itextpdf.layout.Document; -import lombok.Getter; -import lombok.Setter; -import org.apache.poi.hssf.usermodel.HSSFWorkbook; -import org.apache.poi.openxml4j.exceptions.InvalidFormatException; -import org.apache.poi.ss.usermodel.Workbook; -import org.apache.poi.xssf.usermodel.XSSFWorkbook; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; - -@Getter -@Setter -public class FileConverterContext { - - private File inputFile; - private File outputFile; - private String fontPath; - private Workbook workbook; - private Document document; - private int[] sheets; - private ExcelTypeEnum excelTypeEnum; - - public FileConverterContext(File inputFile, File outputFile, String fontPath, int[] sheets) { - try { - this.inputFile = inputFile; - this.outputFile = outputFile; - this.fontPath = fontPath; - ReadWorkbook readWorkbook = new ReadWorkbook(); - readWorkbook.setFile(inputFile); - excelTypeEnum = ExcelTypeEnum.valueOf(readWorkbook); - if (excelTypeEnum == ExcelTypeEnum.XLSX) { - this.workbook = new XSSFWorkbook(inputFile); - } else if (excelTypeEnum == ExcelTypeEnum.XLS) { - this.workbook = new HSSFWorkbook(new FileInputStream(inputFile)); - } else { - throw new IllegalArgumentException("Not supported excel type"); - } - PdfDocument pdfDocument = new PdfDocument(new PdfWriter(outputFile)); - this.document = new Document(pdfDocument, PageSize.A4.rotate()); - if (sheets == null) { - this.sheets = new int[workbook.getNumberOfSheets()]; - for (int i = 0; i < workbook.getNumberOfSheets(); i++) { - this.sheets[i] = i; - } - } else { - this.sheets = sheets; - } - } catch (IOException e) { - throw new RuntimeException(e); - } catch (InvalidFormatException e) { - throw new RuntimeException(e); - } - } - - public ExcelConverter getExcelConverter() { - if (excelTypeEnum == ExcelTypeEnum.XLSX) { - return new cn.idev.excel.fileconvertor.v07.XlsxConverter(this); - } else if (excelTypeEnum == ExcelTypeEnum.XLS) { - return new cn.idev.excel.fileconvertor.v03.XlsConverter(this); - } - throw new IllegalArgumentException("Not supported excel type"); - } - - -} diff --git a/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/v03/XlsConverter.java b/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/v03/XlsConverter.java deleted file mode 100644 index 680c339..0000000 --- a/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/v03/XlsConverter.java +++ /dev/null @@ -1,150 +0,0 @@ -package cn.idev.excel.fileconvertor.v03; - -import cn.idev.excel.fileconvertor.BaseExcelConverter; -import cn.idev.excel.fileconvertor.Excel2PdfUtils; -import cn.idev.excel.fileconvertor.FileConverterContext; -import cn.idev.excel.util.StringUtils; -import com.itextpdf.io.font.PdfEncodings; -import com.itextpdf.kernel.colors.Color; -import com.itextpdf.kernel.colors.ColorConstants; -import com.itextpdf.kernel.colors.DeviceRgb; -import com.itextpdf.kernel.font.PdfFontFactory; -import com.itextpdf.layout.borders.*; -import com.itextpdf.layout.element.*; -import com.itextpdf.layout.element.Cell; -import com.itextpdf.layout.element.Table; -import org.apache.poi.hssf.usermodel.*; -import org.apache.poi.hssf.util.HSSFColor; -import org.apache.poi.ss.usermodel.*; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -public class XlsConverter extends BaseExcelConverter { - public XlsConverter(FileConverterContext context) { - super(context); - } - - @Override - public void addPicsToTable(Table table, Sheet sheet) { - HSSFPatriarch drawingPatriarch = ((HSSFSheet) sheet).getDrawingPatriarch(); - if (drawingPatriarch != null) { - List pictures = new ArrayList<>(); - for (HSSFShape shape : drawingPatriarch.getChildren()) { - if (shape instanceof HSSFPicture) { - pictures.add((HSSFPicture) shape); - } - } - table.setNextRenderer(new XlsImageTableRenderer(table, pictures, (HSSFSheet) sheet)); - } - } - - @Override - public Cell convertCell(org.apache.poi.ss.usermodel.Cell cell, int rowspan, int colspan, float maxWidth, String fontPath) throws IOException { - String value = Excel2PdfUtils.getValue(cell); - Cell pdfCell = createPdfCell(rowspan, colspan, cell, value, maxWidth, fontPath); - - return pdfCell; - } - - private Cell createPdfCell(int rowspan, int colspan, org.apache.poi.ss.usermodel.Cell cell, String value, float maxWidth, String fontPath) throws IOException { - float cellHeight = cell.getRow().getHeightInPoints() * 1.2f; - Cell pdfCell = new Cell(rowspan, colspan) - .setHeight(cellHeight) - .setPadding(0); - Text text = new Text(value); - setPdfCellFont((HSSFCell) cell, text, fontPath); - - Paragraph paragraph = new Paragraph(text).setPadding(0f).setMargin(0f); - HSSFCellStyle cellStyle = ((HSSFCell) cell).getCellStyle(); - if (cellStyle.getWrapText()) { - paragraph.setMaxWidth(maxWidth); - } - - pdfCell.add(paragraph); - - setCellStyles(cell, pdfCell); - return pdfCell; - } - - private void setCellStyles(org.apache.poi.ss.usermodel.Cell cell, Cell pdfCell) throws IOException { - HSSFCellStyle cellStyle = ((HSSFCell) cell).getCellStyle(); - // Layout - pdfCell.setVerticalAlignment(getVerticalAlignment(cellStyle.getVerticalAlignment())); - pdfCell.setTextAlignment(getTextAlignment(cellStyle.getAlignment(), cell.getCellType())); - - // Set borders - transformBorders((HSSFCell) cell, pdfCell); - - // Set background color - setBackgroundColor(cellStyle, pdfCell, cell); - } - - private void setBackgroundColor(HSSFCellStyle cellStyle, Cell pdfCell, org.apache.poi.ss.usermodel.Cell cell) { - short colorIndex = cellStyle.getFillForegroundColor(); - HSSFWorkbook workbook = (HSSFWorkbook) cell.getSheet().getWorkbook(); - HSSFColor color = workbook.getCustomPalette().getColor(colorIndex); - if (color != null && color.getIndex() != 64) { - short[] triplet = color.getTriplet(); - int r = Math.min(triplet[0] + 32, 255); - int g = Math.min(triplet[1] + 90, 255); - int b = Math.min(triplet[2] + 60, 255); - pdfCell.setBackgroundColor(new DeviceRgb(r, g, b)); - } - } - - public static void transformBorders(HSSFCell cell, Cell pdfCell) { - HSSFCellStyle cellStyle = cell.getCellStyle(); - pdfCell.setBorderBottom(getBorder(cellStyle.getBorderBottom(), cellStyle.getBottomBorderColor(), cell)); - pdfCell.setBorderLeft(getBorder(cellStyle.getBorderLeft(), cellStyle.getLeftBorderColor(), cell)); - pdfCell.setBorderRight(getBorder(cellStyle.getBorderRight(), cellStyle.getRightBorderColor(), cell)); - pdfCell.setBorderTop(getBorder(cellStyle.getBorderTop(), cellStyle.getTopBorderColor(), cell)); - } - - private void setPdfCellFont(HSSFCell cell, Text text, String fontPath) throws IOException { - HSSFCellStyle cellStyle = cell.getCellStyle(); - HSSFFont font = cellStyle.getFont(cell.getSheet().getWorkbook()); - text.setFont(StringUtils.isEmpty(fontPath) ? PdfFontFactory.createFont() : PdfFontFactory.createFont(fontPath, PdfEncodings.IDENTITY_H)); - text.setFontSize(font.getFontHeightInPoints()); - - // Set font color - HSSFColor hssfColor = font.getHSSFColor(cell.getSheet().getWorkbook()); - if (hssfColor != null && hssfColor.getIndex() != 64) { - short[] triplet = hssfColor.getTriplet(); - text.setFontColor(new DeviceRgb(triplet[0], triplet[1], triplet[2])); - } - - // Set font styles - if (font.getBold()) text.setBold(); - if (font.getItalic()) text.setItalic(); - if (font.getUnderline() == 1) text.setUnderline(0.5f, -1f); - } - - public static Border getBorder(BorderStyle borderStyle, short colorIndex, HSSFCell cell) { - HSSFPalette customPalette = cell.getSheet().getWorkbook().getCustomPalette(); - HSSFColor color = customPalette.getColor(colorIndex); - Color defaultColor = (color != null && color.getIndex() != 64) - ? new DeviceRgb(color.getTriplet()[0], color.getTriplet()[1], color.getTriplet()[2]) - : ColorConstants.BLACK; - - switch (borderStyle) { - case THIN: - return new SolidBorder(defaultColor, 0.3f); - case MEDIUM: - return new SolidBorder(defaultColor, 0.5f); - case DASHED: - return new DashedBorder(defaultColor, 0.3f); - case DOTTED: - return new DottedBorder(defaultColor, 0.3f); - case THICK: - return new SolidBorder(defaultColor, 1f); - case DOUBLE: - return new DoubleBorder(defaultColor, 0.3f); - case MEDIUM_DASHED: - return new DashedBorder(defaultColor, 0.5f); - default: - return Border.NO_BORDER; - } - } -} diff --git a/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/v03/XlsImageTableRenderer.java b/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/v03/XlsImageTableRenderer.java deleted file mode 100644 index a77094b..0000000 --- a/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/v03/XlsImageTableRenderer.java +++ /dev/null @@ -1,116 +0,0 @@ -package cn.idev.excel.fileconvertor.v03; - -import com.itextpdf.io.image.ImageData; -import com.itextpdf.io.image.ImageDataFactory; -import com.itextpdf.kernel.geom.Rectangle; -import com.itextpdf.layout.element.Table; -import com.itextpdf.layout.renderer.CellRenderer; -import com.itextpdf.layout.renderer.DrawContext; -import com.itextpdf.layout.renderer.IRenderer; -import com.itextpdf.layout.renderer.TableRenderer; -import org.apache.poi.hssf.usermodel.HSSFClientAnchor; -import org.apache.poi.hssf.usermodel.HSSFPicture; -import org.apache.poi.hssf.usermodel.HSSFSheet; - -import java.util.List; - -/** - * Renders images from an Excel sheet onto a PDF table. - */ -public class XlsImageTableRenderer extends TableRenderer { - private List hSSFPictures; - private HSSFSheet sheet; - - public XlsImageTableRenderer(Table modelElement, List hSSFPictures, HSSFSheet sheet) { - super(modelElement); - this.hSSFPictures = hSSFPictures; - this.sheet = sheet; - } - - @Override - public void drawChildren(DrawContext drawContext) { - super.drawChildren(drawContext); - drawExcelImages(drawContext); - } - - private void drawExcelImages(DrawContext drawContext) { - for (HSSFPicture picture : hSSFPictures) { - HSSFClientAnchor clientAnchor = picture.getClientAnchor(); - Rectangle imageRect = calculateImageRectangle(clientAnchor); - ImageData imageData = ImageDataFactory.create(picture.getPictureData().getData()); - drawContext.getCanvas().addImage(imageData, - imageRect.getWidth(), - 0, - 0, - imageRect.getHeight(), - imageRect.getLeft(), - imageRect.getTop()); - } - } - - private Rectangle calculateImageRectangle(HSSFClientAnchor clientAnchor) { - CellRenderer cellRenderer1 = rows.get(clientAnchor.getRow1())[clientAnchor.getCol1()]; - Rectangle rect1 = cellRenderer1.getOccupiedAreaBBox(); - - CellRenderer cellRenderer2 = rows.get(clientAnchor.getRow2())[clientAnchor.getCol2()]; - Rectangle rect2 = cellRenderer2.getOccupiedAreaBBox(); - - float widthRate = calculateWidthRate(rect2); - float heightRate = calculateHeightRate(rect2); - - float width = calculateImageWidth(clientAnchor, widthRate); - float height = calculateImageHeight(clientAnchor, heightRate); - - float x = rect1.getLeft() + clientAnchor.getDx1() * widthRate; - float y = rect1.getTop() - height - clientAnchor.getDy1() * heightRate; - - return new Rectangle(x, y, width, height); - } - - private float calculateWidthRate(Rectangle rect2) { - return (super.getOccupiedAreaBBox().getWidth() + rect2.getWidth()) / getExcelWidth(sheet); - } - - private float calculateHeightRate(Rectangle rect2) { - return (super.getOccupiedAreaBBox().getHeight() - rect2.getHeight()) / getExcelHeight(sheet); - } - - private float calculateImageWidth(HSSFClientAnchor clientAnchor, float widthRate) { - float width = 0f; - for (int j = clientAnchor.getCol1(); j < clientAnchor.getCol2(); j++) { - width += sheet.getColumnWidth(j); - } - return Math.abs(width - clientAnchor.getDx1() + clientAnchor.getDx2()) * widthRate; - } - - private float calculateImageHeight(HSSFClientAnchor clientAnchor, float heightRate) { - float height = 0f; - for (int j = clientAnchor.getRow1(); j < clientAnchor.getRow2(); j++) { - height += sheet.getRow(j).getHeight(); - } - return Math.abs(height - clientAnchor.getDy1() + clientAnchor.getDy2()) * heightRate; - } - - private float getExcelHeight(HSSFSheet sheet) { - int physicalNumberOfRows = sheet.getPhysicalNumberOfRows(); - float result = 0; - for (int i = 0; i < physicalNumberOfRows; i++) { - result += sheet.getRow(i).getHeight(); - } - return result; - } - - private float getExcelWidth(HSSFSheet sheet) { - short lastCellNum = sheet.getRow(0).getLastCellNum(); - float result = 0; - for (int i = 0; i < lastCellNum; i++) { - result += sheet.getColumnWidth(i); - } - return result; - } - - @Override - public IRenderer getNextRenderer() { - return new XlsImageTableRenderer((Table) modelElement, hSSFPictures, sheet); - } -} diff --git a/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/v07/XlsxConverter.java b/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/v07/XlsxConverter.java deleted file mode 100644 index 8ab1bbc..0000000 --- a/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/v07/XlsxConverter.java +++ /dev/null @@ -1,161 +0,0 @@ -package cn.idev.excel.fileconvertor.v07; - -import cn.idev.excel.fileconvertor.BaseExcelConverter; -import cn.idev.excel.fileconvertor.Excel2PdfUtils; -import cn.idev.excel.fileconvertor.FileConverterContext; -import cn.idev.excel.util.StringUtils; -import com.itextpdf.io.font.PdfEncodings; -import com.itextpdf.kernel.colors.DeviceRgb; -import com.itextpdf.kernel.font.PdfFontFactory; -import com.itextpdf.layout.borders.*; -import com.itextpdf.layout.element.Paragraph; -import com.itextpdf.layout.element.Table; -import com.itextpdf.layout.element.Text; -import org.apache.poi.ss.usermodel.*; -import org.apache.poi.xssf.usermodel.*; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -public class XlsxConverter extends BaseExcelConverter { - private static final String DEFAULT_FONT_PATH = System.getProperty("user.dir") + "/doc/font/SimHei.TTF"; - - public XlsxConverter(FileConverterContext context) { - super(context); - } - - @Override - public void addPicsToTable(Table table, Sheet sheet) { - XSSFDrawing drawing = (XSSFDrawing) sheet.createDrawingPatriarch(); - if (drawing != null) { - List pictures = new ArrayList<>(); - for (XSSFShape shape : drawing.getShapes()) { - if (shape instanceof XSSFPicture) { - pictures.add((XSSFPicture) shape); - } - } - table.setNextRenderer(new XlsxImageTableRenderer(table, pictures, (XSSFSheet) sheet)); - } - } - - @Override - public com.itextpdf.layout.element.Cell convertCell(Cell cell, int rowspan, int colspan, float maxWidth, String fontPath) throws IOException { - String value = Excel2PdfUtils.getValue(cell); - com.itextpdf.layout.element.Cell pdfCell = createPdfCell(rowspan, colspan, cell, value, maxWidth, fontPath); - return pdfCell; - } - - public static void transformBorder(XSSFCell cell, com.itextpdf.layout.element.Cell pdfCell) { - XSSFCellStyle cellStyle = cell.getCellStyle(); - BorderStyle borderBottom = cellStyle.getBorderBottom(); - pdfCell.setBorderBottom(getBorder(borderBottom, cellStyle.getBottomBorderXSSFColor())); - - BorderStyle borderLeft = cellStyle.getBorderLeft(); - pdfCell.setBorderLeft(getBorder(borderLeft, cellStyle.getLeftBorderXSSFColor())); - - BorderStyle borderRight = cellStyle.getBorderRight(); - pdfCell.setBorderRight(getBorder(borderRight, cellStyle.getRightBorderXSSFColor())); - - BorderStyle borderTop = cellStyle.getBorderTop(); - pdfCell.setBorderTop(getBorder(borderTop, cellStyle.getTopBorderXSSFColor())); - } - - private com.itextpdf.layout.element.Cell createPdfCell(int rowspan, int colspan, Cell cell, String value, float maxWidth, String fontPath) throws IOException { - com.itextpdf.layout.element.Cell pdfCell = new com.itextpdf.layout.element.Cell(rowspan, colspan) - .setHeight(cell.getRow().getHeightInPoints() * 1.2f) - .setPadding(0); - Text text = new Text(value); - setPdfCellFont((XSSFCell) cell, text, fontPath); - Paragraph paragraph = new Paragraph(text).setPadding(0f).setMargin(0f); - XSSFCellStyle cellStyle = ((XSSFCell) cell).getCellStyle(); - if (cellStyle.getWrapText()) { - paragraph.setMaxWidth(maxWidth); - } - pdfCell.add(paragraph); - setCellStyles((XSSFCell)cell, pdfCell); - return pdfCell; - } - - private void setCellStyles( XSSFCell cell,com.itextpdf.layout.element.Cell pdfCell) throws IOException { - XSSFCellStyle cellStyle = cell.getCellStyle(); - pdfCell.setVerticalAlignment(getVerticalAlignment(cellStyle.getVerticalAlignment())) - .setTextAlignment(getTextAlignment(cellStyle.getAlignment(), cell.getCellType())); - - // Set borders and background color - setBorders(pdfCell, cellStyle); - setBackgroundColor(pdfCell, cellStyle); - } - - private void setBorders(com.itextpdf.layout.element.Cell pdfCell, XSSFCellStyle cellStyle) { - pdfCell.setBorderBottom(getBorder(cellStyle.getBorderBottom(), cellStyle.getBottomBorderXSSFColor())); - pdfCell.setBorderLeft(getBorder(cellStyle.getBorderLeft(), cellStyle.getLeftBorderXSSFColor())); - pdfCell.setBorderRight(getBorder(cellStyle.getBorderRight(), cellStyle.getRightBorderXSSFColor())); - pdfCell.setBorderTop(getBorder(cellStyle.getBorderTop(), cellStyle.getTopBorderXSSFColor())); - } - - private void setBackgroundColor(com.itextpdf.layout.element.Cell pdfCell, XSSFCellStyle cellStyle) { - XSSFColor fillColor = cellStyle.getFillForegroundXSSFColor(); - if (fillColor != null) { - byte[] rgb = fillColor.getRGB(); - if (rgb != null) { - pdfCell.setBackgroundColor(new DeviceRgb(Byte.toUnsignedInt(rgb[0]), Byte.toUnsignedInt(rgb[1]), Byte.toUnsignedInt(rgb[2]))); - } - } - } - - private void setPdfCellFont(XSSFCell cell, Text text,String fontPath) throws IOException { - XSSFCellStyle cellStyle = cell.getCellStyle(); - short fontHeight = cellStyle.getFont().getFontHeightInPoints(); - cellStyle.getFont().getFontName(); - text.setFont(StringUtils.isEmpty(fontPath) ? PdfFontFactory.createFont() : PdfFontFactory.createFont(fontPath, PdfEncodings.IDENTITY_H)); - text.setFontSize(fontHeight); - setFontColor(cellStyle.getFont(), text); - setFontStyles(cell.getCellStyle().getFont(), text); - } - - private void setFontColor(XSSFFont font, Text text) { - XSSFColor xssfColor = font.getXSSFColor(); - if (xssfColor != null && xssfColor.getIndex() != 64) { - byte[] rgb = xssfColor.getRGB(); - if (rgb != null) { - text.setFontColor(new DeviceRgb(Byte.toUnsignedInt(rgb[0]), Byte.toUnsignedInt(rgb[1]), Byte.toUnsignedInt(rgb[2]))); - } - } - } - - private void setFontStyles(XSSFFont font, Text text) { - if (font.getBold()) text.setBold(); - if (font.getItalic()) text.setItalic(); - if (font.getUnderline() == 1) text.setUnderline(0.5f, -1f); - } - - public static com.itextpdf.layout.borders.Border getBorder(BorderStyle borderStyle, XSSFColor xSSFColor) { - DeviceRgb defaultColor = new DeviceRgb(0, 0, 0); // Default to black - if (xSSFColor != null) { - byte[] rgb = xSSFColor.getRGB(); - if (rgb != null) { - defaultColor = new DeviceRgb(Byte.toUnsignedInt(rgb[0]), Byte.toUnsignedInt(rgb[1]), Byte.toUnsignedInt(rgb[2])); - } - } - - switch (borderStyle) { - case THIN: - return new SolidBorder(defaultColor, 0.3f); - case MEDIUM: - return new SolidBorder(defaultColor, 0.5f); - case DASHED: - return new DashedBorder(defaultColor, 0.3f); - case DOTTED: - return new DottedBorder(defaultColor, 0.3f); - case THICK: - return new SolidBorder(defaultColor, 1f); - case DOUBLE: - return new DoubleBorder(defaultColor, 0.3f); - case MEDIUM_DASHED: - return new DashedBorder(defaultColor, 0.5f); - default: - return Border.NO_BORDER; - } - } -} \ No newline at end of file diff --git a/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/v07/XlsxImageTableRenderer.java b/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/v07/XlsxImageTableRenderer.java deleted file mode 100644 index 017704b..0000000 --- a/fastexcel-core/src/main/java/cn/idev/excel/fileconvertor/v07/XlsxImageTableRenderer.java +++ /dev/null @@ -1,101 +0,0 @@ -package cn.idev.excel.fileconvertor.v07; - -import com.itextpdf.io.image.ImageData; -import com.itextpdf.io.image.ImageDataFactory; -import com.itextpdf.kernel.geom.Rectangle; -import com.itextpdf.layout.element.Table; -import com.itextpdf.layout.renderer.CellRenderer; -import com.itextpdf.layout.renderer.DrawContext; -import com.itextpdf.layout.renderer.IRenderer; -import com.itextpdf.layout.renderer.TableRenderer; -import org.apache.poi.xssf.usermodel.XSSFClientAnchor; -import org.apache.poi.xssf.usermodel.XSSFPicture; -import org.apache.poi.xssf.usermodel.XSSFSheet; - -import java.util.List; - -/** - * Renders images from an Excel sheet onto a PDF table. - */ -public class XlsxImageTableRenderer extends TableRenderer { - private List xssfPictures; - private XSSFSheet sheet; - - public XlsxImageTableRenderer(Table modelElement, List xssfPictures, XSSFSheet sheet) { - super(modelElement); - this.xssfPictures = xssfPictures; - this.sheet = sheet; - } - - @Override - public void drawChildren(DrawContext drawContext) { - super.drawChildren(drawContext); - renderExcelImages(drawContext); - } - - private void renderExcelImages(DrawContext drawContext) { - for (XSSFPicture picture : xssfPictures) { - XSSFClientAnchor clientAnchor = picture.getClientAnchor(); - Rectangle imageRect = calculateImageRectangle(clientAnchor); - ImageData imageData = ImageDataFactory.create(picture.getPictureData().getData()); - drawContext.getCanvas().addImage(imageData, - imageRect.getWidth(), - 0, - 0, - imageRect.getHeight(), - imageRect.getLeft(), - imageRect.getTop()); - } - } - - private Rectangle calculateImageRectangle(XSSFClientAnchor clientAnchor) { - CellRenderer cellRenderer1 = rows.get(clientAnchor.getRow1())[clientAnchor.getCol1()]; - CellRenderer cellRenderer2 = rows.get(clientAnchor.getRow2())[clientAnchor.getCol2()]; - Rectangle rect1 = cellRenderer1.getOccupiedAreaBBox(); - Rectangle rect2 = cellRenderer2.getOccupiedAreaBBox(); - - float widthRate = (super.getOccupiedAreaBBox().getWidth() + rect2.getWidth()) / getExcelWidth(sheet); - float heightRate = (super.getOccupiedAreaBBox().getHeight() - rect2.getHeight()) / getExcelHeight(sheet); - - float width = calculateImageWidth(clientAnchor, widthRate); - float height = calculateImageHeight(clientAnchor, heightRate); - - float x = rect1.getLeft() + clientAnchor.getDx1() * widthRate; - float y = rect1.getTop() - height - clientAnchor.getDy1() * heightRate; - - return new Rectangle(x, y, width, height); - } - - private float calculateImageWidth(XSSFClientAnchor clientAnchor, float widthRate) { - float width = 0f; - for (int j = clientAnchor.getCol1(); j < clientAnchor.getCol2(); j++) { - width += sheet.getColumnWidth(j); - } - return Math.abs(width - clientAnchor.getDx1() + clientAnchor.getDx2()) * widthRate; - } - - private float calculateImageHeight(XSSFClientAnchor clientAnchor, float heightRate) { - float height = 0f; - for (int j = clientAnchor.getRow1(); j < clientAnchor.getRow2(); j++) { - height += sheet.getRow(j).getHeight(); - } - return Math.abs(height - clientAnchor.getDy1() + clientAnchor.getDy2()) * heightRate; - } - - private float getExcelHeight(XSSFSheet sheet) { - float totalHeight = 0; - for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) { - totalHeight += sheet.getRow(i).getHeight(); - } - return totalHeight; - } - - private float getExcelWidth(XSSFSheet sheet) { - return (short)sheet.getRow(0).getLastCellNum() * sheet.getColumnWidth(0); - } - - @Override - public IRenderer getNextRenderer() { - return new XlsxImageTableRenderer((Table) modelElement, xssfPictures, sheet); - } -} From e3bb870c8ffff5936f81d851796e737c9d38deca Mon Sep 17 00:00:00 2001 From: psxjoy Date: Fri, 20 Dec 2024 23:36:07 +0800 Subject: [PATCH 04/14] bugfix: Fix Potential Row Misalignment or Data Corruption When Using Fill for Empty Data --- .../excel/write/executor/ExcelWriteFillExecutor.java | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/fastexcel-core/src/main/java/cn/idev/excel/write/executor/ExcelWriteFillExecutor.java b/fastexcel-core/src/main/java/cn/idev/excel/write/executor/ExcelWriteFillExecutor.java index 31ac11e..fbdd712 100644 --- a/fastexcel-core/src/main/java/cn/idev/excel/write/executor/ExcelWriteFillExecutor.java +++ b/fastexcel-core/src/main/java/cn/idev/excel/write/executor/ExcelWriteFillExecutor.java @@ -23,6 +23,7 @@ import cn.idev.excel.util.FieldUtils; import cn.idev.excel.util.ListUtils; import cn.idev.excel.util.MapUtils; +import cn.idev.excel.util.PoiUtils; import cn.idev.excel.util.StringUtils; import cn.idev.excel.util.WriteHandlerUtils; import cn.idev.excel.write.handler.context.CellWriteHandlerContext; @@ -31,15 +32,11 @@ import cn.idev.excel.write.metadata.fill.FillConfig; import cn.idev.excel.write.metadata.fill.FillWrapper; import cn.idev.excel.write.metadata.holder.WriteSheetHolder; - import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; import org.apache.commons.collections4.CollectionUtils; - -import cn.idev.excel.util.PoiUtils; - import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.CellType; @@ -212,10 +209,10 @@ private void doFill(List analysisCellList, Object oneRowData, Fill if (analysisCell.getOnlyOneVariable()) { String variable = analysisCell.getVariableList().get(0); - if (!dataKeySet.contains(variable)) { - continue; + Object value = null; + if (dataKeySet.contains(variable)) { + value = dataMap.get(variable); } - Object value = dataMap.get(variable); ExcelContentProperty excelContentProperty = ClassUtils.declaredExcelContentProperty(dataMap, writeContext.currentWriteHolder().excelWriteHeadProperty().getHeadClazz(), variable, writeContext.currentWriteHolder()); From 9b066e4f31474108d43057997dd50d4a5b742cb1 Mon Sep 17 00:00:00 2001 From: psxjoy Date: Fri, 20 Dec 2024 23:38:56 +0800 Subject: [PATCH 05/14] bugfix: Fix Potential Row Misalignment or Data Corruption When Using Fill for Empty Data --- .../idev/excel/write/executor/ExcelWriteFillExecutor.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fastexcel-core/src/main/java/cn/idev/excel/write/executor/ExcelWriteFillExecutor.java b/fastexcel-core/src/main/java/cn/idev/excel/write/executor/ExcelWriteFillExecutor.java index fbdd712..00bb41d 100644 --- a/fastexcel-core/src/main/java/cn/idev/excel/write/executor/ExcelWriteFillExecutor.java +++ b/fastexcel-core/src/main/java/cn/idev/excel/write/executor/ExcelWriteFillExecutor.java @@ -244,10 +244,10 @@ private void doFill(List analysisCellList, Object oneRowData, Fill for (String variable : analysisCell.getVariableList()) { cellValueBuild.append(analysisCell.getPrepareDataList().get(index++)); - if (!dataKeySet.contains(variable)) { - continue; + Object value = null; + if (dataKeySet.contains(variable)) { + value = dataMap.get(variable); } - Object value = dataMap.get(variable); ExcelContentProperty excelContentProperty = ClassUtils.declaredExcelContentProperty(dataMap, writeContext.currentWriteHolder().excelWriteHeadProperty().getHeadClazz(), variable, writeContext.currentWriteHolder()); From 4e105e6573af9bf41b198662ce8bd4fe72a5a633 Mon Sep 17 00:00:00 2001 From: psxjoy Date: Sat, 21 Dec 2024 00:02:46 +0800 Subject: [PATCH 06/14] feat: update pom.xml --- pom.xml | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/pom.xml b/pom.xml index 0e814c5..dfd85de 100644 --- a/pom.xml +++ b/pom.xml @@ -79,19 +79,6 @@ - - - - - - - - - - - - - From ecf53cba01c67c8a72df86838cff33aa6323937d Mon Sep 17 00:00:00 2001 From: psxjoy Date: Sat, 21 Dec 2024 00:21:09 +0800 Subject: [PATCH 07/14] refactor: refactor code style --- .../ExcludeOrIncludeDataTest.java | 46 +++-- style/codestyle/idea/codestyle.xml | 176 +++++++++--------- 2 files changed, 115 insertions(+), 107 deletions(-) diff --git a/fastexcel-test/src/test/java/cn/idev/excel/test/core/excludeorinclude/ExcludeOrIncludeDataTest.java b/fastexcel-test/src/test/java/cn/idev/excel/test/core/excludeorinclude/ExcludeOrIncludeDataTest.java index 013a466..d8401a0 100644 --- a/fastexcel-test/src/test/java/cn/idev/excel/test/core/excludeorinclude/ExcludeOrIncludeDataTest.java +++ b/fastexcel-test/src/test/java/cn/idev/excel/test/core/excludeorinclude/ExcludeOrIncludeDataTest.java @@ -1,11 +1,19 @@ package cn.idev.excel.test.core.excludeorinclude; -import cn.idev.excel.test.util.TestFileUtil; -import cn.idev.excel.EasyExcel; -import org.junit.jupiter.api.*; - import java.io.File; -import java.util.*; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import cn.idev.excel.EasyExcel; +import cn.idev.excel.test.util.TestFileUtil; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; /** * @author Jiaju Zhuang @@ -150,7 +158,7 @@ private void excludeIndex(File file) { excludeColumnIndexes.add(0); excludeColumnIndexes.add(3); EasyExcel.write(file, ExcludeOrIncludeData.class).excludeColumnIndexes(excludeColumnIndexes).sheet() - .doWrite(data()); + .doWrite(data()); List> dataMap = EasyExcel.read(file).sheet().doReadSync(); Assertions.assertEquals(1, dataMap.size()); Map record = dataMap.get(0); @@ -166,7 +174,7 @@ private void excludeFieldName(File file) { excludeColumnFieldNames.add("column3"); excludeColumnFieldNames.add("column4"); EasyExcel.write(file, ExcludeOrIncludeData.class).excludeColumnFieldNames(excludeColumnFieldNames).sheet() - .doWrite(data()); + .doWrite(data()); List> dataMap = EasyExcel.read(file).sheet().doReadSync(); Assertions.assertEquals(1, dataMap.size()); Map record = dataMap.get(0); @@ -180,7 +188,7 @@ private void includeIndex(File file) { includeColumnIndexes.add(1); includeColumnIndexes.add(2); EasyExcel.write(file, ExcludeOrIncludeData.class).includeColumnIndexes(includeColumnIndexes).sheet() - .doWrite(data()); + .doWrite(data()); List> dataMap = EasyExcel.read(file).sheet().doReadSync(); Assertions.assertEquals(1, dataMap.size()); Map record = dataMap.get(0); @@ -195,9 +203,9 @@ private void includeFieldName(File file) { includeColumnFieldNames.add("column2"); includeColumnFieldNames.add("column3"); EasyExcel.write(file, ExcludeOrIncludeData.class) - .sheet() - .includeColumnFieldNames(includeColumnFieldNames) - .doWrite(data()); + .sheet() + .includeColumnFieldNames(includeColumnFieldNames) + .doWrite(data()); List> dataMap = EasyExcel.read(file).sheet().doReadSync(); Assertions.assertEquals(1, dataMap.size()); Map record = dataMap.get(0); @@ -213,10 +221,10 @@ private void includeFieldNameOrderIndex(File file) { includeColumnIndexes.add(2); includeColumnIndexes.add(0); EasyExcel.write(file, ExcludeOrIncludeData.class) - .includeColumnIndexes(includeColumnIndexes) - .orderByIncludeColumn(true). - sheet() - .doWrite(data()); + .includeColumnIndexes(includeColumnIndexes) + .orderByIncludeColumn(true). + sheet() + .doWrite(data()); List> dataMap = EasyExcel.read(file).sheet().doReadSync(); Assertions.assertEquals(1, dataMap.size()); Map record = dataMap.get(0); @@ -233,10 +241,10 @@ private void includeFieldNameOrder(File file) { includeColumnFieldNames.add("column2"); includeColumnFieldNames.add("column3"); EasyExcel.write(file, ExcludeOrIncludeData.class) - .includeColumnFieldNames(includeColumnFieldNames) - .orderByIncludeColumn(true). - sheet() - .doWrite(data()); + .includeColumnFieldNames(includeColumnFieldNames) + .orderByIncludeColumn(true). + sheet() + .doWrite(data()); List> dataMap = EasyExcel.read(file).sheet().doReadSync(); Assertions.assertEquals(1, dataMap.size()); Map record = dataMap.get(0); diff --git a/style/codestyle/idea/codestyle.xml b/style/codestyle/idea/codestyle.xml index 5ee5b77..01b9c73 100644 --- a/style/codestyle/idea/codestyle.xml +++ b/style/codestyle/idea/codestyle.xml @@ -1,91 +1,91 @@ - - - \ No newline at end of file From 4aeddf3faa757f5a3760f76b9f4b4d62a9614270 Mon Sep 17 00:00:00 2001 From: psxjoy Date: Sat, 21 Dec 2024 00:27:57 +0800 Subject: [PATCH 08/14] refactor: Remove Redundant Validation in File Encryption Process --- .../java/cn/idev/excel/support/ExcelTypeEnum.java | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/fastexcel-core/src/main/java/cn/idev/excel/support/ExcelTypeEnum.java b/fastexcel-core/src/main/java/cn/idev/excel/support/ExcelTypeEnum.java index 2b5b0e6..43eda84 100644 --- a/fastexcel-core/src/main/java/cn/idev/excel/support/ExcelTypeEnum.java +++ b/fastexcel-core/src/main/java/cn/idev/excel/support/ExcelTypeEnum.java @@ -8,8 +8,6 @@ import cn.idev.excel.exception.ExcelAnalysisException; import cn.idev.excel.exception.ExcelCommonException; import cn.idev.excel.read.metadata.ReadWorkbook; -import cn.idev.excel.util.StringUtils; - import lombok.Getter; import org.apache.poi.util.IOUtils; @@ -59,12 +57,6 @@ public static ExcelTypeEnum valueOf(ReadWorkbook readWorkbook) { if (!file.exists()) { throw new ExcelAnalysisException("File " + file.getAbsolutePath() + " not exists."); } - // If there is a password, use the FileMagic first - if (!StringUtils.isEmpty(readWorkbook.getPassword())) { - try (BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(file))) { - return recognitionExcelType(bufferedInputStream); - } - } // Use the name to determine the type String fileName = file.getName(); if (fileName.endsWith(XLSX.getValue())) { @@ -74,10 +66,8 @@ public static ExcelTypeEnum valueOf(ReadWorkbook readWorkbook) { } else if (fileName.endsWith(CSV.getValue())) { return CSV; } - if (StringUtils.isEmpty(readWorkbook.getPassword())) { - try (BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(file))) { - return recognitionExcelType(bufferedInputStream); - } + try (BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(file))) { + return recognitionExcelType(bufferedInputStream); } } if (!inputStream.markSupported()) { From 52d4d58ddd82f4ecbd0c70d6734037fe96d61349 Mon Sep 17 00:00:00 2001 From: psxjoy Date: Sat, 21 Dec 2024 00:35:32 +0800 Subject: [PATCH 09/14] refactor: Remove Redundant Validation in File Encryption Process --- .../java/cn/idev/excel/support/ExcelTypeEnum.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/fastexcel-core/src/main/java/cn/idev/excel/support/ExcelTypeEnum.java b/fastexcel-core/src/main/java/cn/idev/excel/support/ExcelTypeEnum.java index 43eda84..2b5b0e6 100644 --- a/fastexcel-core/src/main/java/cn/idev/excel/support/ExcelTypeEnum.java +++ b/fastexcel-core/src/main/java/cn/idev/excel/support/ExcelTypeEnum.java @@ -8,6 +8,8 @@ import cn.idev.excel.exception.ExcelAnalysisException; import cn.idev.excel.exception.ExcelCommonException; import cn.idev.excel.read.metadata.ReadWorkbook; +import cn.idev.excel.util.StringUtils; + import lombok.Getter; import org.apache.poi.util.IOUtils; @@ -57,6 +59,12 @@ public static ExcelTypeEnum valueOf(ReadWorkbook readWorkbook) { if (!file.exists()) { throw new ExcelAnalysisException("File " + file.getAbsolutePath() + " not exists."); } + // If there is a password, use the FileMagic first + if (!StringUtils.isEmpty(readWorkbook.getPassword())) { + try (BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(file))) { + return recognitionExcelType(bufferedInputStream); + } + } // Use the name to determine the type String fileName = file.getName(); if (fileName.endsWith(XLSX.getValue())) { @@ -66,8 +74,10 @@ public static ExcelTypeEnum valueOf(ReadWorkbook readWorkbook) { } else if (fileName.endsWith(CSV.getValue())) { return CSV; } - try (BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(file))) { - return recognitionExcelType(bufferedInputStream); + if (StringUtils.isEmpty(readWorkbook.getPassword())) { + try (BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(file))) { + return recognitionExcelType(bufferedInputStream); + } } } if (!inputStream.markSupported()) { From 048cc93c8ecf0b95268dd1faadd27d6dd9708b97 Mon Sep 17 00:00:00 2001 From: psxjoy Date: Sat, 21 Dec 2024 14:19:05 +0800 Subject: [PATCH 10/14] refactor: refactor code-style (#149) * feat: update pom.xml * refactor: refactor code style * refactor: Remove Redundant Validation in File Encryption Process * refactor: Remove Redundant Validation in File Encryption Process * refactor: refactor code-style * fix: fix typo by @tanpenggood in 3432 --- .../analysis/v07/handlers/sax/SharedStringsTableHandler.java | 4 ++-- .../src/main/java/cn/idev/excel/enums/ByteOrderMarkEnum.java | 5 +---- .../src/main/java/cn/idev/excel/enums/CacheLocationEnum.java | 4 ++-- .../src/main/java/cn/idev/excel/enums/CellDataTypeEnum.java | 3 +-- .../src/main/java/cn/idev/excel/enums/CellExtraTypeEnum.java | 2 +- .../src/main/java/cn/idev/excel/enums/HeadKindEnum.java | 2 +- .../main/java/cn/idev/excel/enums/ReadDefaultReturnEnum.java | 3 +-- .../main/java/cn/idev/excel/enums/WriteLastRowTypeEnum.java | 2 +- .../idev/excel/enums/WriteTemplateAnalysisCellTypeEnum.java | 2 +- .../src/main/java/cn/idev/excel/enums/WriteTypeEnum.java | 2 +- .../cn/idev/excel/read/listener/ModelBuildEventListener.java | 2 +- .../main/java/cn/idev/excel/read/metadata/ReadWorkbook.java | 5 ++--- .../src/main/java/cn/idev/excel/util/StyleUtil.java | 2 +- .../test/java/cn/idev/excel/test/demo/write/WriteTest.java | 2 +- .../temp/csv/{CsvDataListeer.java => CsvDataListener.java} | 2 +- .../test/java/cn/idev/excel/test/temp/csv/CsvReadTest.java | 2 +- .../cn/idev/excel/test/temp/dataformat/DataFormatter1.java | 2 +- 17 files changed, 20 insertions(+), 26 deletions(-) rename fastexcel-test/src/test/java/cn/idev/excel/test/temp/csv/{CsvDataListeer.java => CsvDataListener.java} (86%) diff --git a/fastexcel-core/src/main/java/cn/idev/excel/analysis/v07/handlers/sax/SharedStringsTableHandler.java b/fastexcel-core/src/main/java/cn/idev/excel/analysis/v07/handlers/sax/SharedStringsTableHandler.java index b3a685f..5fcf8a6 100644 --- a/fastexcel-core/src/main/java/cn/idev/excel/analysis/v07/handlers/sax/SharedStringsTableHandler.java +++ b/fastexcel-core/src/main/java/cn/idev/excel/analysis/v07/handlers/sax/SharedStringsTableHandler.java @@ -33,7 +33,7 @@ Licensed to the Apache Software Foundation (ASF) under one or more */ public class SharedStringsTableHandler extends DefaultHandler { - private static final Pattern UTF_PATTTERN = Pattern.compile("_x([0-9A-Fa-f]{4})_"); + private static final Pattern UTF_PATTERN = Pattern.compile("_x([0-9A-Fa-f]{4})_"); /** * The final piece of data @@ -154,7 +154,7 @@ static String utfDecode(String value) { } StringBuilder buf = new StringBuilder(); - Matcher m = UTF_PATTTERN.matcher(value); + Matcher m = UTF_PATTERN.matcher(value); int idx = 0; while (m.find()) { int pos = m.start(); diff --git a/fastexcel-core/src/main/java/cn/idev/excel/enums/ByteOrderMarkEnum.java b/fastexcel-core/src/main/java/cn/idev/excel/enums/ByteOrderMarkEnum.java index 3823fb0..dac97d4 100644 --- a/fastexcel-core/src/main/java/cn/idev/excel/enums/ByteOrderMarkEnum.java +++ b/fastexcel-core/src/main/java/cn/idev/excel/enums/ByteOrderMarkEnum.java @@ -4,7 +4,6 @@ import java.util.Map; import cn.idev.excel.util.MapUtils; - import lombok.Getter; import org.apache.commons.io.ByteOrderMark; @@ -35,9 +34,7 @@ public enum ByteOrderMarkEnum { /** * UTF_32LE */ - UTF_32LE(ByteOrderMark.UTF_32LE), - - ; + UTF_32LE(ByteOrderMark.UTF_32LE); final ByteOrderMark byteOrderMark; final String stringPrefix; diff --git a/fastexcel-core/src/main/java/cn/idev/excel/enums/CacheLocationEnum.java b/fastexcel-core/src/main/java/cn/idev/excel/enums/CacheLocationEnum.java index 34a47de..7d5e293 100644 --- a/fastexcel-core/src/main/java/cn/idev/excel/enums/CacheLocationEnum.java +++ b/fastexcel-core/src/main/java/cn/idev/excel/enums/CacheLocationEnum.java @@ -1,7 +1,7 @@ package cn.idev.excel.enums; /** - * cache locaciton + * cache location * * @author Jiaju Zhuang **/ @@ -19,5 +19,5 @@ public enum CacheLocationEnum { /** * No caching.It may lose some of performance. */ - NONE; + NONE } diff --git a/fastexcel-core/src/main/java/cn/idev/excel/enums/CellDataTypeEnum.java b/fastexcel-core/src/main/java/cn/idev/excel/enums/CellDataTypeEnum.java index a03cb7b..66f2f25 100644 --- a/fastexcel-core/src/main/java/cn/idev/excel/enums/CellDataTypeEnum.java +++ b/fastexcel-core/src/main/java/cn/idev/excel/enums/CellDataTypeEnum.java @@ -43,8 +43,7 @@ public enum CellDataTypeEnum { /** * rich text string.Support only when writing. */ - RICH_TEXT_STRING, - ; + RICH_TEXT_STRING; private static final Map TYPE_ROUTING_MAP = new HashMap(16); diff --git a/fastexcel-core/src/main/java/cn/idev/excel/enums/CellExtraTypeEnum.java b/fastexcel-core/src/main/java/cn/idev/excel/enums/CellExtraTypeEnum.java index fd78233..9408a5c 100644 --- a/fastexcel-core/src/main/java/cn/idev/excel/enums/CellExtraTypeEnum.java +++ b/fastexcel-core/src/main/java/cn/idev/excel/enums/CellExtraTypeEnum.java @@ -17,5 +17,5 @@ public enum CellExtraTypeEnum { /** * Merge */ - MERGE,; + MERGE } diff --git a/fastexcel-core/src/main/java/cn/idev/excel/enums/HeadKindEnum.java b/fastexcel-core/src/main/java/cn/idev/excel/enums/HeadKindEnum.java index a65023f..6678a85 100644 --- a/fastexcel-core/src/main/java/cn/idev/excel/enums/HeadKindEnum.java +++ b/fastexcel-core/src/main/java/cn/idev/excel/enums/HeadKindEnum.java @@ -17,5 +17,5 @@ public enum HeadKindEnum { /** * String */ - STRING; + STRING } diff --git a/fastexcel-core/src/main/java/cn/idev/excel/enums/ReadDefaultReturnEnum.java b/fastexcel-core/src/main/java/cn/idev/excel/enums/ReadDefaultReturnEnum.java index de45050..c724b63 100644 --- a/fastexcel-core/src/main/java/cn/idev/excel/enums/ReadDefaultReturnEnum.java +++ b/fastexcel-core/src/main/java/cn/idev/excel/enums/ReadDefaultReturnEnum.java @@ -31,7 +31,6 @@ public enum ReadDefaultReturnEnum { /** * Return to {@link ReadCellData}, can decide which field you need. */ - READ_CELL_DATA, - ; + READ_CELL_DATA } diff --git a/fastexcel-core/src/main/java/cn/idev/excel/enums/WriteLastRowTypeEnum.java b/fastexcel-core/src/main/java/cn/idev/excel/enums/WriteLastRowTypeEnum.java index 21d029e..ac4bb89 100644 --- a/fastexcel-core/src/main/java/cn/idev/excel/enums/WriteLastRowTypeEnum.java +++ b/fastexcel-core/src/main/java/cn/idev/excel/enums/WriteLastRowTypeEnum.java @@ -17,5 +17,5 @@ public enum WriteLastRowTypeEnum { /** * Any data has been written; */ - HAS_DATA,; + HAS_DATA } diff --git a/fastexcel-core/src/main/java/cn/idev/excel/enums/WriteTemplateAnalysisCellTypeEnum.java b/fastexcel-core/src/main/java/cn/idev/excel/enums/WriteTemplateAnalysisCellTypeEnum.java index 27e9b7d..e65c255 100644 --- a/fastexcel-core/src/main/java/cn/idev/excel/enums/WriteTemplateAnalysisCellTypeEnum.java +++ b/fastexcel-core/src/main/java/cn/idev/excel/enums/WriteTemplateAnalysisCellTypeEnum.java @@ -13,5 +13,5 @@ public enum WriteTemplateAnalysisCellTypeEnum { /** * A collection of fields. */ - COLLECTION,; + COLLECTION } diff --git a/fastexcel-core/src/main/java/cn/idev/excel/enums/WriteTypeEnum.java b/fastexcel-core/src/main/java/cn/idev/excel/enums/WriteTypeEnum.java index ef3e10f..bcf4d97 100644 --- a/fastexcel-core/src/main/java/cn/idev/excel/enums/WriteTypeEnum.java +++ b/fastexcel-core/src/main/java/cn/idev/excel/enums/WriteTypeEnum.java @@ -13,5 +13,5 @@ public enum WriteTypeEnum { /** * Fill. */ - FILL,; + FILL } diff --git a/fastexcel-core/src/main/java/cn/idev/excel/read/listener/ModelBuildEventListener.java b/fastexcel-core/src/main/java/cn/idev/excel/read/listener/ModelBuildEventListener.java index 3b20ef5..812ae70 100644 --- a/fastexcel-core/src/main/java/cn/idev/excel/read/listener/ModelBuildEventListener.java +++ b/fastexcel-core/src/main/java/cn/idev/excel/read/listener/ModelBuildEventListener.java @@ -60,7 +60,7 @@ private Object buildNoModel(Map> cellDataMap, ReadSheet (String) ConverterUtils.convertToJavaObject(cellData, null, null, readSheetHolder.converterMap(), context, context.readRowHolder().getRowIndex(), key)); } else { - // retrun ReadCellData + // return ReadCellData ReadCellData convertedReadCellData = convertReadCellData(cellData, context.readWorkbookHolder().getReadDefaultReturn(), readSheetHolder, context, key); if (readDefaultReturn == ReadDefaultReturnEnum.READ_CELL_DATA) { diff --git a/fastexcel-core/src/main/java/cn/idev/excel/read/metadata/ReadWorkbook.java b/fastexcel-core/src/main/java/cn/idev/excel/read/metadata/ReadWorkbook.java index a103fb1..bfcd8f5 100644 --- a/fastexcel-core/src/main/java/cn/idev/excel/read/metadata/ReadWorkbook.java +++ b/fastexcel-core/src/main/java/cn/idev/excel/read/metadata/ReadWorkbook.java @@ -10,13 +10,12 @@ import cn.idev.excel.cache.ReadCache; import cn.idev.excel.cache.selector.ReadCacheSelector; import cn.idev.excel.cache.selector.SimpleReadCacheSelector; +import cn.idev.excel.context.AnalysisContext; import cn.idev.excel.enums.CellExtraTypeEnum; import cn.idev.excel.enums.ReadDefaultReturnEnum; import cn.idev.excel.event.AnalysisEventListener; -import cn.idev.excel.context.AnalysisContext; import cn.idev.excel.read.listener.ModelBuildEventListener; import cn.idev.excel.support.ExcelTypeEnum; - import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; @@ -97,7 +96,7 @@ public class ReadWorkbook extends ReadBasicParameter { * Whether to use the default listener, which is used by default. *

* The {@link ModelBuildEventListener} is loaded by default to convert the object. - * defualt is true. + * default is true. */ private Boolean useDefaultListener; diff --git a/fastexcel-core/src/main/java/cn/idev/excel/util/StyleUtil.java b/fastexcel-core/src/main/java/cn/idev/excel/util/StyleUtil.java index b6c3478..366a300 100644 --- a/fastexcel-core/src/main/java/cn/idev/excel/util/StyleUtil.java +++ b/fastexcel-core/src/main/java/cn/idev/excel/util/StyleUtil.java @@ -127,7 +127,7 @@ public static short buildDataFormat(Workbook workbook, DataFormatData dataFormat } if (StringUtils.isNotBlank(dataFormatData.getFormat())) { if (log.isDebugEnabled()) { - log.info("create new data fromat:{}", dataFormatData); + log.info("create new data format:{}", dataFormatData); } DataFormat dataFormatCreate = workbook.createDataFormat(); return dataFormatCreate.getFormat(dataFormatData.getFormat()); diff --git a/fastexcel-test/src/test/java/cn/idev/excel/test/demo/write/WriteTest.java b/fastexcel-test/src/test/java/cn/idev/excel/test/demo/write/WriteTest.java index 5106148..e05dc73 100644 --- a/fastexcel-test/src/test/java/cn/idev/excel/test/demo/write/WriteTest.java +++ b/fastexcel-test/src/test/java/cn/idev/excel/test/demo/write/WriteTest.java @@ -363,7 +363,7 @@ public void writeCellDataWrite() { writeCellStyleData.setFillForegroundColor(IndexedColors.GREEN.getIndex()); // 设置单个单元格多种样式 - // 这里需要设置 inMomery=true 不然会导致无法展示单个单元格多种样式,所以慎用 + // 这里需要设置 inMemory=true 不然会导致无法展示单个单元格多种样式,所以慎用 WriteCellData richTest = new WriteCellData<>(); richTest.setType(CellDataTypeEnum.RICH_TEXT_STRING); writeCellDemoData.setRichText(richTest); diff --git a/fastexcel-test/src/test/java/cn/idev/excel/test/temp/csv/CsvDataListeer.java b/fastexcel-test/src/test/java/cn/idev/excel/test/temp/csv/CsvDataListener.java similarity index 86% rename from fastexcel-test/src/test/java/cn/idev/excel/test/temp/csv/CsvDataListeer.java rename to fastexcel-test/src/test/java/cn/idev/excel/test/temp/csv/CsvDataListener.java index 89aa632..9aafafd 100644 --- a/fastexcel-test/src/test/java/cn/idev/excel/test/temp/csv/CsvDataListeer.java +++ b/fastexcel-test/src/test/java/cn/idev/excel/test/temp/csv/CsvDataListener.java @@ -7,7 +7,7 @@ import lombok.extern.slf4j.Slf4j; @Slf4j -public class CsvDataListeer extends AnalysisEventListener { +public class CsvDataListener extends AnalysisEventListener { @Override public void invoke(CsvData data, AnalysisContext context) { log.info("data:{}", JSON.toJSONString(data)); diff --git a/fastexcel-test/src/test/java/cn/idev/excel/test/temp/csv/CsvReadTest.java b/fastexcel-test/src/test/java/cn/idev/excel/test/temp/csv/CsvReadTest.java index f82fd94..b6e47cd 100644 --- a/fastexcel-test/src/test/java/cn/idev/excel/test/temp/csv/CsvReadTest.java +++ b/fastexcel-test/src/test/java/cn/idev/excel/test/temp/csv/CsvReadTest.java @@ -72,7 +72,7 @@ public void writev2() throws Exception { // 如果这里想使用03 则 传入excelType参数即可 EasyExcel.write(fileName, CsvData.class).sheet().doWrite(data()); - EasyExcel.read(fileName, CsvData.class, new CsvDataListeer()).sheet().doRead(); + EasyExcel.read(fileName, CsvData.class, new CsvDataListener()).sheet().doRead(); } @Test diff --git a/fastexcel-test/src/test/java/cn/idev/excel/test/temp/dataformat/DataFormatter1.java b/fastexcel-test/src/test/java/cn/idev/excel/test/temp/dataformat/DataFormatter1.java index c7a3342..8b074b3 100644 --- a/fastexcel-test/src/test/java/cn/idev/excel/test/temp/dataformat/DataFormatter1.java +++ b/fastexcel-test/src/test/java/cn/idev/excel/test/temp/dataformat/DataFormatter1.java @@ -102,7 +102,7 @@ * and space ("_ ") in the format adds a space to the end and Excel formats this cell as "12.34 ", but * DataFormatter trims the formatted value and returns "12.34". *

- * You can enable spaces by passing the emulateCSV=true flag in the DateFormatter cosntructor. + * You can enable spaces by passing the emulateCSV=true flag in the DateFormatter constructor. * If set to true, then the output tries to conform to what you get when you take an xls or xlsx in Excel and Save As * CSV file: *
    From 2e10c3b377d32b10d59b738374de70432c656b7b Mon Sep 17 00:00:00 2001 From: psxjoy Date: Mon, 23 Dec 2024 14:17:38 +0800 Subject: [PATCH 11/14] feat: add update.md (#153) * feat: update pom.xml * refactor: refactor code style * refactor: Remove Redundant Validation in File Encryption Process * refactor: Remove Redundant Validation in File Encryption Process * refactor: refactor code-style * fix: fix typo by @tanpenggood in 3432 * bug: fix Mismatch Between Error Messages and Actual Issues by @jackfanwan in 3383 * feat: add update.md * feat: add update.md --- .../main/java/cn/idev/excel/support/ExcelTypeEnum.java | 4 +++- update.md | 9 +++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/fastexcel-core/src/main/java/cn/idev/excel/support/ExcelTypeEnum.java b/fastexcel-core/src/main/java/cn/idev/excel/support/ExcelTypeEnum.java index 2b5b0e6..cab94e0 100644 --- a/fastexcel-core/src/main/java/cn/idev/excel/support/ExcelTypeEnum.java +++ b/fastexcel-core/src/main/java/cn/idev/excel/support/ExcelTypeEnum.java @@ -9,8 +9,8 @@ import cn.idev.excel.exception.ExcelCommonException; import cn.idev.excel.read.metadata.ReadWorkbook; import cn.idev.excel.util.StringUtils; - import lombok.Getter; +import org.apache.poi.EmptyFileException; import org.apache.poi.util.IOUtils; /** @@ -87,6 +87,8 @@ public static ExcelTypeEnum valueOf(ReadWorkbook readWorkbook) { return recognitionExcelType(inputStream); } catch (ExcelCommonException e) { throw e; + } catch (EmptyFileException e) { + throw new ExcelCommonException("The supplied file was empty (zero bytes long)"); } catch (Exception e) { throw new ExcelCommonException( "Convert excel format exception.You can try specifying the 'excelType' yourself", e); diff --git a/update.md b/update.md index e69de29..78ffae3 100644 --- a/update.md +++ b/update.md @@ -0,0 +1,9 @@ +# 1.1.0 +此次升级主要修复历史 BUG,同时剔除了部分依赖库,保证 `MIT` 协议下的使用。 + +具体更新内容如下: +- 【改进】移除 `itext` 依赖库,将 `转换PDF` 功能迁移至新项目; +- 【修复】fill填充空数据,可能导致行数据错乱的问题; +- 【修复】打印CSV文件的 `hashcode`,可能会产生的堆栈溢出问题; +- 【优化】增加报错内容详细信息; +- 【优化】更新代码格式和部分错别字。 From 937f62025e5e4bdb5df9442755614b4a726bfce7 Mon Sep 17 00:00:00 2001 From: psxjoy Date: Mon, 23 Dec 2024 21:50:41 +0800 Subject: [PATCH 12/14] bugfix: Fix Potential Data Read Failures Caused by Custom Data Formats.by @zyd0131 at #2319 (#156) --- .../excel/metadata/format/DataFormatter.java | 8 ++++ .../excel/test/temp/issue2319/Issue2319.java | 13 +++++++ .../test/temp/issue2319/Issue2319Test.java | 36 ++++++++++++++++++ .../test/resources/temp/issue2319/test1.xlsx | Bin 0 -> 9007 bytes .../test/resources/temp/issue2319/test2.xlsx | Bin 0 -> 8970 bytes update.md | 2 +- 6 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 fastexcel-test/src/test/java/cn/idev/excel/test/temp/issue2319/Issue2319.java create mode 100644 fastexcel-test/src/test/java/cn/idev/excel/test/temp/issue2319/Issue2319Test.java create mode 100644 fastexcel-test/src/test/resources/temp/issue2319/test1.xlsx create mode 100644 fastexcel-test/src/test/resources/temp/issue2319/test2.xlsx diff --git a/fastexcel-core/src/main/java/cn/idev/excel/metadata/format/DataFormatter.java b/fastexcel-core/src/main/java/cn/idev/excel/metadata/format/DataFormatter.java index 28c0013..48460cd 100644 --- a/fastexcel-core/src/main/java/cn/idev/excel/metadata/format/DataFormatter.java +++ b/fastexcel-core/src/main/java/cn/idev/excel/metadata/format/DataFormatter.java @@ -118,6 +118,8 @@ public class DataFormatter { */ private static final String invalidDateTimeString; + private static final BigDecimal TEN = new BigDecimal(10); + static { StringBuilder buf = new StringBuilder(); for (int i = 0; i < 255; i++) {buf.append('#');} @@ -524,11 +526,17 @@ public InternalDecimalFormatWithScale(String pattern, DecimalFormatSymbols symbo setExcelStyleRoundingMode(df); Matcher endsWithCommasMatcher = endsWithCommas.matcher(pattern); if (endsWithCommasMatcher.find()) { + int index_point = pattern.indexOf("."); + int index_comma = pattern.indexOf(","); + int cnt = index_comma - index_point - 1; String commas = (endsWithCommasMatcher.group(1)); BigDecimal temp = BigDecimal.ONE; for (int i = 0; i < commas.length(); ++i) { temp = temp.multiply(ONE_THOUSAND); } + for (int i = 0; i < cnt ; i++) { + temp = temp.multiply(TEN); + } divider = temp; } else { divider = null; diff --git a/fastexcel-test/src/test/java/cn/idev/excel/test/temp/issue2319/Issue2319.java b/fastexcel-test/src/test/java/cn/idev/excel/test/temp/issue2319/Issue2319.java new file mode 100644 index 0000000..30f72a2 --- /dev/null +++ b/fastexcel-test/src/test/java/cn/idev/excel/test/temp/issue2319/Issue2319.java @@ -0,0 +1,13 @@ +package cn.idev.excel.test.temp.issue2319; + +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@EqualsAndHashCode +public class Issue2319 { + private String num1; + private String num2; +} \ No newline at end of file diff --git a/fastexcel-test/src/test/java/cn/idev/excel/test/temp/issue2319/Issue2319Test.java b/fastexcel-test/src/test/java/cn/idev/excel/test/temp/issue2319/Issue2319Test.java new file mode 100644 index 0000000..8789b55 --- /dev/null +++ b/fastexcel-test/src/test/java/cn/idev/excel/test/temp/issue2319/Issue2319Test.java @@ -0,0 +1,36 @@ +package cn.idev.excel.test.temp.issue2319; + +import java.io.File; + +import com.alibaba.fastjson2.JSON; + +import cn.idev.excel.EasyExcel; +import cn.idev.excel.FastExcel; +import cn.idev.excel.read.listener.PageReadListener; +import cn.idev.excel.test.util.TestFileUtil; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Test; + +@Slf4j +public class Issue2319Test { + @Test + public void IssueTest1() { + String fileName = TestFileUtil.getPath() + "temp/issue2319" + File.separator + "test1.xlsx"; + FastExcel.read(fileName, Issue2319.class, new PageReadListener(dataList -> { + for (Issue2319 issueData : dataList) { + System.out.println(("读取到一条数据{}" + JSON.toJSONString(issueData))); + } + })).sheet().doRead(); + } + + //CS304 (manually written) Issue link: https://github.com/alibaba/easyexcel/issues/2319 + @Test + public void IssueTest2() { + String fileName = TestFileUtil.getPath() + "temp/issue2319" + File.separator + "test2.xlsx"; + FastExcel.read(fileName, Issue2319.class, new PageReadListener(dataList -> { + for (Issue2319 issueData : dataList) { + System.out.println(("读取到一条数据{}" + JSON.toJSONString(issueData))); + } + })).sheet().doRead(); + } +} diff --git a/fastexcel-test/src/test/resources/temp/issue2319/test1.xlsx b/fastexcel-test/src/test/resources/temp/issue2319/test1.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..6c6cc8d7c412b2f6f2798ee809d0fd6fa72e0de4 GIT binary patch literal 9007 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 G`1XG;4t59t literal 0 HcmV?d00001 diff --git a/update.md b/update.md index 78ffae3..1f9ef4a 100644 --- a/update.md +++ b/update.md @@ -4,6 +4,6 @@ 具体更新内容如下: - 【改进】移除 `itext` 依赖库,将 `转换PDF` 功能迁移至新项目; - 【修复】fill填充空数据,可能导致行数据错乱的问题; -- 【修复】打印CSV文件的 `hashcode`,可能会产生的堆栈溢出问题; +- 【修复】自定义数据格式可能导致数据读取失败的问题; - 【优化】增加报错内容详细信息; - 【优化】更新代码格式和部分错别字。 From 7c0c0331fd344179cf572d355877c1b77b57b9dd Mon Sep 17 00:00:00 2001 From: psxjoy Date: Wed, 25 Dec 2024 20:36:41 +0800 Subject: [PATCH 13/14] Update docs and set pre-release version (#168) * docs: Updated the documentation and configurations, setting the pre-release version to 1.1.0 * docs: Updated the documentation,setting the pre-release version to 1.1.0 --- .../pull_request_template.md | 12 ++ CONTRIBUTING.md | 144 ++++++++++++++++++ README.md | 8 +- README_EN.md | 8 +- README_JP.md | 8 +- easyexcel_en.md | 1 - fastexcel-core/pom.xml | 16 ++ pom.xml | 2 +- update.md | 6 +- 9 files changed, 192 insertions(+), 13 deletions(-) delete mode 100644 easyexcel_en.md diff --git a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md index e69de29..bf3d413 100644 --- a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +++ b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md @@ -0,0 +1,12 @@ + + +### Ⅰ. 描述这个 PR 做了什么 + +### Ⅱ. 这个 pull request 是否修复了一个问题? + + +### Ⅲ. 为什么不需要添加测试用例(单元测试/集成测试)? + +### Ⅳ. 描述如何验证它 + +### Ⅴ. 评审的特别说明 \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e69de29..cb1a3ad 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -0,0 +1,144 @@ +# 为 FastExcel 做贡献 + +FastExcel 欢迎社区的每一位用户和开发者成为贡献者。无论是报告问题、改进文档、提交代码,还是提供技术支持,您的参与都将帮助 FastExcel 变得更好。 + +--- + +## 报告问题 + +我们鼓励用户在使用 FastExcel 的过程中随时提供反馈。您可以通过 [NEW ISSUE](https://github.com/CodePhiliaX/fastexcel/issues/new/choose) 提交问题。 + +### 高质量问题报告 + +为了提高沟通效率,请在提交问题前: +1. **搜索现有问题**:检查您的问题是否已被报告。如果存在,请直接在现有问题下评论补充详细信息,而不是创建新问题。 +2. **使用问题模板**:问题模板位于 [ISSUE TEMPLATE](./.github/ISSUE_TEMPLATE),请按照模板要求填写,以确保问题描述准确且完整。 + +以下情况适合提交新问题: +- Bug 报告 +- 新功能需求 +- 性能问题 +- 功能提案或设计 +- 文档改进 +- 测试覆盖率优化 +- 需要技术支持 +- 其他与项目相关的问题 + +> **注意**:请勿在问题中包含敏感信息,如密码、密钥、服务器地址或私人数据。 + +--- + +## 贡献代码与文档 + +所有对 FastExcel 的改进均可通过 Pull Request (PR) 实现。无论是修复 Bug、优化代码、增强功能,还是改进文档,都非常欢迎! + +### 您可以贡献的方向 +- 修复错别字 +- 修复 Bug +- 删除冗余代码 +- 添加测试用例 +- 增强功能 +- 添加注释以提升代码可读性 +- 优化代码结构 +- 改进或完善文档 + +**原则**:**任何有助于项目改进的 PR 都值得鼓励!** + +在提交 PR 前,请熟悉以下指南: +1. [工作区准备](#工作区准备) +2. [分支定义](#分支定义) +3. [提交规则](#提交规则) +4. [PR 说明](#pr说明) + +--- + +### 工作区准备 + +确保您已注册 GitHub 账号,并按照以下步骤完成本地开发环境配置: +1. **Fork 仓库**:在 FastExcel 的 [GitHub 页面](https://github.com/CodePhiliaX/fastexcel) 点击 `Fork` 按钮,将项目复制到您的 GitHub 账户下,例如:`https://github.com//fastexcel`。 +2. **克隆代码库**:运行以下命令将 Fork 的项目克隆到本地: + ```bash + git clone git@github.com:/fastexcel.git + ``` +3. **设置上游仓库**:将官方仓库设置为 `upstream`,方便同步更新: + ```bash + git remote add upstream git@github.com:CodePhiliaX/fastexcel.git + git remote set-url --push upstream no-pushing + ``` + 运行 `git remote -v` 可检查配置是否正确。 + +--- + +### 分支定义 + +在 FastExcel 中,所有贡献应基于 `main` 开发分支。此外,还有以下分支类型: +- **release 分支**:用于版本发布(如 `0.6.0`, `0.6.1`)。 +- **feature 分支**:用于开发较大的功能。 +- **hotfix 分支**:用于修复重要 Bug。 + +提交 PR 时,请确保变更基于 `main` 分支。 + +--- + +### 提交规则 + +#### 提交信息 +请确保提交消息清晰且具有描述性,遵循以下格式: +- **docs**: 更新文档,例如 `docs: 更新 PR 提交指南`。 +- **feature**: 新功能,例如 `feature: 支持 并发写入`。 +- **bugfix**: 修复 Bug,例如 `bugfix: 修复空指针异常`。 +- **refactor**: 重构代码,例如 `refactor: 优化数据处理逻辑`。 +- **test**: 增加或改进测试,例如 `test: 添加单元测试`。 + +不建议使用模糊的提交信息,如: +- ~~修复问题~~ +- ~~更新代码~~ + +如果需要帮助,请参考 [如何编写 Git 提交消息](http://chris.beams.io/posts/git-commit/)。 + +#### 提交内容 +一次提交应包含完整且可审查的更改,确保: +- 避免提交过于庞大的改动。 +- 每次提交内容独立且可通过 CI 测试。 + +另外,请确保提交时配置正确的 Git 用户信息: +```bash +git config --get user.name +git config --get user.email +``` + +--- + +### PR 说明 + +为了帮助审阅者快速了解 PR 的内容和目的,请使用 [PR 模板](.github/PULL_REQUEST_TEMPLATE/pull_request_template.md)。详细的描述将极大提高代码审阅效率。 + +--- + +## 测试用例贡献 + +任何测试用例的贡献都值得鼓励,尤其是单元测试。建议在对应模块的 `test` 目录中创建 `XXXTest.java` 文件,推荐使用 JUnit5 框架。 + +--- + +## 其他参与方式 + +除了直接贡献代码,以下方式同样是对 FastExcel 的宝贵支持: +- 回答其他用户的问题。 +- 帮助审阅他人的 PR。 +- 提出改进建议。 +- 撰写技术博客,宣传 FastExcel。 +- 在社区中分享项目相关知识。 + +--- + +## 代码风格 + +请遵循 [阿里巴巴 Java 编码规范](https://alibaba.github.io/Alibaba-Java-Coding-Guidelines/) 进行代码编写。 +您可以选择安装以下插件(非必需)以帮助检查代码风格: +- **IntelliJ IDEA 插件**:[安装指南](https://github.com/alibaba/p3c/blob/master/idea-plugin/README.md) +- **Eclipse 插件**:[安装指南](https://github.com/alibaba/p3c/blob/master/eclipse-plugin/README.md) + +--- + +**最后,感谢您对 FastExcel 的支持!每一份帮助,都是我们前进的动力。** \ No newline at end of file diff --git a/README.md b/README.md index 4ad7e7d..14666da 100644 --- a/README.md +++ b/README.md @@ -37,20 +37,22 @@ FastExcel 将始终坚持免费开源,并采用最开放的 MIT 协议,使 > 当前 FastExcel 底层使用 poi 作为基础包,如果您的项目中已经有 poi 相关组件,需要您手动排除 poi 的相关 jar 包。 +## 更新 +您可以在 [版本升级详情](update.md) 中查询到具体的版本更新细节。 您也可以在[Maven 中心仓库](https://mvnrepository.com/artifact/cn.idev.excel/fastexcel)中查询到所有的版本。 ### Maven 如果您使用 Maven 进行项目构建,请在 `pom.xml` 文件中引入以下配置: ```xml cn.idev.excel fastexcel - 1.0.0 + 1.1.0 ``` ### Gradle 如果您使用 Gradle 进行项目构建,请在 `build.gradle` 文件中引入以下配置: ```gradle dependencies { - implementation 'cn.idev.excel:fastexcel:1.0.0' + implementation 'cn.idev.excel:fastexcel:1.1.0' } ``` ## EasyExcel 与 FastExcel 的区别 @@ -75,7 +77,7 @@ dependencies { cn.idev.excel fastexcel - 1.0.0 + 1.1.0 ``` diff --git a/README_EN.md b/README_EN.md index 3be94db..6d791c5 100644 --- a/README_EN.md +++ b/README_EN.md @@ -37,7 +37,7 @@ If you are using Maven for project building, add the following configuration in cn.idev.excel fastexcel - 1.0.0 + 1.1.0 ``` ### Gradle @@ -45,9 +45,11 @@ If you are using Gradle for project building, add the following configuration in ```gradle dependencies { - implementation 'cn.idev.excel:fastexcel:1.0.0' + implementation 'cn.idev.excel:fastexcel:1.1.0' } ``` +## Update +For detailed update logs, refer to [Details of version updates](update.md). You can also find all available versions in the [Maven Central Repository](https://mvnrepository.com/artifact/cn.idev.excel/fastexcel). ## Differences Between EasyExcel and FastExcel - FastExcel supports all the features of EasyExcel but with better performance and stability. @@ -71,7 +73,7 @@ Replace with: cn.idev.excel fastexcel - 1.0.0 + 1.1.0 ``` ### 2. Modify Code diff --git a/README_JP.md b/README_JP.md index 00e2aac..2a11235 100644 --- a/README_JP.md +++ b/README_JP.md @@ -37,7 +37,7 @@ Mavenでプロジェクトを構築する場合、`pom.xml`ファイルに次の cn.idev.excel fastexcel - 1.0.0 + 1.1.0 ``` ### Gradle @@ -45,9 +45,11 @@ Mavenでプロジェクトを構築する場合、`pom.xml`ファイルに次の Gradleでプロジェクトを構築する場合、build.gradleファイルに次の構成を含めてください: ```gradle dependencies { - implementation 'cn.idev.excel:fastexcel:1.0.0' + implementation 'cn.idev.excel:fastexcel:1.1.0' } ``` +## 更新する +具体的なバージョンアップ内容は[バージョンアップ詳細](update.md)で確認できます。 [Maven Central Repository](https://mvnrepository.com/artifact/cn.idev.excel/fastexcel) 内のすべてのバージョンをクエリすることもできます。 ## EasyExcelとFastExcelの違い - FastExcelはEasyExcelのすべての機能をサポートしていますが、FastExcelのパフォーマンスはより良く、より安定しています。 - FastExcelとEasyExcelのAPIは完全に一致しているため、シームレスに切り替えることができます。 @@ -68,7 +70,7 @@ EasyExcelの依存関係をFastExcelの依存関係に置き換えます。以 cn.idev.excel fastexcel - 1.0.0 + 1.1.0 ``` ### 2. コードの修正 diff --git a/easyexcel_en.md b/easyexcel_en.md deleted file mode 100644 index 56a6051..0000000 --- a/easyexcel_en.md +++ /dev/null @@ -1 +0,0 @@ -1 \ No newline at end of file diff --git a/fastexcel-core/pom.xml b/fastexcel-core/pom.xml index c026612..02393d3 100644 --- a/fastexcel-core/pom.xml +++ b/fastexcel-core/pom.xml @@ -28,11 +28,27 @@ org.apache.poi poi 5.2.5 + + + commons-io + commons-io + + + commons-codec + commons-codec + + org.apache.poi poi-ooxml 5.2.5 + + + commons-io + commons-io + + diff --git a/pom.xml b/pom.xml index dfd85de..f55ebca 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ - 1.0.0 + 1.1.0 UTF-8 1.8 true diff --git a/update.md b/update.md index 1f9ef4a..5ff8322 100644 --- a/update.md +++ b/update.md @@ -1,9 +1,11 @@ # 1.1.0 -此次升级主要修复历史 BUG,同时剔除了部分依赖库,保证 `MIT` 协议下的使用。 +此次升级主要修复 [EasyExcel](https://github.com/alibaba/easyexcel) 历史 BUG,同时剔除了部分依赖库,保证符合 `MIT` 协议的相关规范。 具体更新内容如下: - 【改进】移除 `itext` 依赖库,将 `转换PDF` 功能迁移至新项目; - 【修复】fill填充空数据,可能导致行数据错乱的问题; - 【修复】自定义数据格式可能导致数据读取失败的问题; +- 【优化】例行升级依赖的Jar包版本; - 【优化】增加报错内容详细信息; -- 【优化】更新代码格式和部分错别字。 +- 【优化】更新代码格式和部分错别字; +- 【优化】更新部分文档和使用说明。 From 9a231ba24111d626c51f62a9097db4148a230eda Mon Sep 17 00:00:00 2001 From: psxjoy Date: Thu, 26 Dec 2024 19:46:34 +0800 Subject: [PATCH 14/14] Update update.md --- update.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/update.md b/update.md index 5ff8322..771e75a 100644 --- a/update.md +++ b/update.md @@ -1,5 +1,5 @@ # 1.1.0 -此次升级主要修复 [EasyExcel](https://github.com/alibaba/easyexcel) 历史 BUG,同时剔除了部分依赖库,保证符合 `MIT` 协议的相关规范。 +此次升级主要修复 [EasyExcel](https://github.com/alibaba/easyexcel) 历史 BUG,同时剔除了部分依赖库,符合 `MIT` 协议的相关规范。 具体更新内容如下: - 【改进】移除 `itext` 依赖库,将 `转换PDF` 功能迁移至新项目;