赞
踩
excel转为图片
这个操作是要根据excel一行一行画出来的
package com.gxuwz.zjh.util; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; import javax.imageio.ImageIO; import com.gxuwz.zjh.entity.Grid; import com.gxuwz.zjh.entity.UserCell; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.stereotype.Component; /** * @author FangZenglin * @date 2023年10月13日16:38 */ @Component public class ExcelZhuanTuPian { public void toImage(String dizhipath,String mubiaopath){ test(dizhipath,mubiaopath); } public static void test(String path,String mubiaopath) { int sheetNum = 0; int imageWidth = 0; int imageHeight = 0; InputStream inputStream; try { inputStream = new FileInputStream(path); Workbook workbook; Sheet sheet; List<List<String>> excelList; int bgColorFlag = 1; if (path.split("\\.")[1].equals("xlsx")) { workbook = new XSSFWorkbook(inputStream); excelList = readXlsx(path, sheetNum); } else { workbook = new HSSFWorkbook(inputStream); excelList = readXls(path, sheetNum); bgColorFlag = 0; } sheet = workbook.getSheetAt(sheetNum); List<CellRangeAddress> rangeAddress = sheet.getMergedRegions(); int totalRow = excelList.size() + 1; int totalCol = excelList.get(0).size(); UserCell[][] cells = new UserCell[totalRow + 1][totalCol + 1]; int[] rowPixPos = new int[totalRow + 1]; rowPixPos[0] = 0; int[] colPixPos = new int[totalCol + 1]; colPixPos[0] = 0; for (int i = 0; i < totalRow - 1; i++) { for (int j = 0; j < totalCol; j++) { cells[i][j] = new UserCell(); cells[i][j].setCell(sheet.getRow(i).getCell(j)); cells[i][j].setRow(i); cells[i][j].setCol(j); boolean ifShow = !(sheet.isColumnHidden(j) || sheet.getRow(i) .getZeroHeight()); cells[i][j].setShow(ifShow); float widthPix = !ifShow ? 0 : (sheet.getColumnWidthInPixels(j)); if (i == 0) { imageWidth += widthPix; } colPixPos[j + 1] = (int) (widthPix * 1.15 + colPixPos[j]); } boolean ifShow = (i >= 0); ifShow = ifShow && !sheet.getRow(i).getZeroHeight(); float heightPoint = !ifShow ? 0 : (sheet.getRow(i).getHeightInPoints()); imageHeight += heightPoint; rowPixPos[i + 1] = (int) (heightPoint * 96 / 72) + rowPixPos[i]; } imageHeight = imageHeight * 96 / 72; imageWidth = imageWidth * 115 / 100; List<Grid> grids = new ArrayList<Grid>(); for (int i = 0; i < totalRow - 1; i++) { for (int j = 0; j < totalCol; j++) { Grid grid = new Grid(); grid.setX(colPixPos[j]); grid.setY(rowPixPos[i]); grid.setWidth(colPixPos[j + 1] - colPixPos[j]); grid.setHeight(rowPixPos[i + 1] - rowPixPos[i]); grid.setRow(cells[i][j].getRow()); grid.setCol(cells[i][j].getCol()); grid.setShow(cells[i][j].isShow()); int[] isInMergedStatus = isInMerged(grid.getRow(), grid.getCol(), rangeAddress); if (isInMergedStatus[0] == 0 && isInMergedStatus[1] == 0) { continue; } else if (isInMergedStatus[0] != -1 && isInMergedStatus[1] != -1) { int lastRowPos = isInMergedStatus[0] > totalRow - 1 ? totalRow - 1 : isInMergedStatus[0]; int lastColPos = isInMergedStatus[1] > totalCol - 1 ? totalCol - 1 : isInMergedStatus[1]; grid.setWidth(colPixPos[lastColPos + 1] - colPixPos[j]); grid.setHeight(rowPixPos[lastRowPos + 1] - rowPixPos[i]); } Cell cell = cells[i][j].getCell(); if (cell != null) { CellStyle cs = cell.getCellStyle(); grid.setBgColor(cs.getFillForegroundColorColor()); org.apache.poi.ss.usermodel.Font font = workbook.getFontAt(cs.getFontIndex()); grid.setFont(font); grid.setFtColor(cs.getFillBackgroundColorColor()); String strCell; CellType cellType = cell.getCellTypeEnum(); switch (cellType) { case STRING: strCell = cell.getStringCellValue(); break; case NUMERIC: String str = String.valueOf(cell.getNumericCellValue()); if(str.contains("E")){ String LeftEStr = str.toString().split("E")[0]; strCell = LeftEStr.split("\\.")[0]+LeftEStr.split("\\.")[1]; }else{ strCell = String.valueOf(cell.getNumericCellValue()); } break; case BLANK: strCell = ""; break; case FORMULA: try { strCell = String.valueOf(cell.getNumericCellValue()); } catch (IllegalStateException e) { strCell = String.valueOf(cell.getRichStringCellValue()); } break; default: strCell = ""; break; } if (cell.getCellStyle().getDataFormatString() .contains("0.00%")) { try { double dbCell = Double.valueOf(strCell); strCell = new DecimalFormat("0.00").format(dbCell * 100) + "%"; } catch (NumberFormatException e) { } } grid.setText(strCell.matches("\\w*\\.0") ? strCell .substring(0, strCell.length() - 2) : strCell); } grids.add(grid); } } BufferedImage image = new BufferedImage(imageWidth, imageHeight,BufferedImage.TYPE_INT_RGB); Graphics2D g2d = image.createGraphics(); g2d.setColor(Color.white); g2d.fillRect(0, 0, imageWidth, imageHeight); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON); g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL,RenderingHints.VALUE_STROKE_NORMALIZE); g2d.setRenderingHint(RenderingHints.KEY_TEXT_LCD_CONTRAST, 140); g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS,RenderingHints.VALUE_FRACTIONALMETRICS_ON); g2d.setRenderingHint(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY); for (Grid g : grids) { if (!g.isShow()) { continue; } // 绘制背景色 if (bgColorFlag == 1) { // Excel2010以及更高-->使用原单元格背景色 g2d.setColor(g.getBgColor() == null ? Color.white : g.getBgColor()); } else { // Excel2007以及更低-->使用白色作为背景色 g2d.setColor(Color.white); } g2d.fillRect(g.getX(), g.getY(), g.getWidth(), g.getHeight()); g2d.setColor(Color.black); g2d.setStroke(new BasicStroke(1)); g2d.drawRect(g.getX(), g.getY(), g.getWidth(), g.getHeight()); g2d.setColor(g.getFtColor()); Font font = g.getFont(); if (font == null) { continue; } FontMetrics fm = g2d.getFontMetrics(font); int strWidth = fm.stringWidth(g.getText()); g2d.setFont(font); g2d.drawString( g.getText(), g.getX() + (g.getWidth() - strWidth) / 2, g.getY() + (g.getHeight() - font.getSize()) / 2+ font.getSize()); } // 表格最后一行有可能不显示,手动画上一行 g2d.drawLine(0, imageHeight - 1, imageWidth - 4, imageHeight - 1); g2d.drawLine(imageWidth-1 , 0, imageWidth-1 , imageHeight-1); g2d.dispose(); ImageIO.write(image, "png", new File(mubiaopath)); workbook.close(); } catch (FileNotFoundException e1) { e1.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } System.out.println("----Output to PNG file Success!----"); } /** * 判断Excel中的单元格是否为合并单元格 * * @param row * @param col * @param rangeAddress * @return 如果不是合并单元格返回{-1,-1},如果是合并单元格并且是一个单元格返回{lastRow,lastCol}, * 如果是合并单元格并且不是第一个格子返回{0,0} */ private static int[] isInMerged(int row, int col, List<CellRangeAddress> rangeAddress) { int[] isInMergedStatus = { -1, -1 }; for (CellRangeAddress cra : rangeAddress) { if (row == cra.getFirstRow() && col == cra.getFirstColumn()) { isInMergedStatus[0] = cra.getLastRow(); isInMergedStatus[1] = cra.getLastColumn(); return isInMergedStatus; } if (row >= cra.getFirstRow() && row <= cra.getLastRow()) { if (col >= cra.getFirstColumn() && col <= cra.getLastColumn()) { isInMergedStatus[0] = 0; isInMergedStatus[1] = 0; return isInMergedStatus; } } } return isInMergedStatus; } public static List<List<String>> readXlsx(String path, int pageNum) { List<List<String>> resultList = new ArrayList<List<String>>(); InputStream in; XSSFWorkbook xssfWorkbook; try { in = new FileInputStream(path); xssfWorkbook = new XSSFWorkbook(in); XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(pageNum); if (xssfSheet != null) { for (int rowNum = 0; rowNum < xssfSheet.getLastRowNum() + 1; rowNum++) { XSSFRow xssfRow = xssfSheet.getRow(rowNum); int minColIX = xssfRow.getFirstCellNum(); int maxColIX = xssfRow.getLastCellNum(); List<String> rowList = new ArrayList<String>(); for (int colIX = minColIX; colIX < maxColIX; colIX++) { XSSFCell cell = xssfRow.getCell(colIX); if (cell != null) { rowList.add(cell.toString()); } } resultList.add(rowList); } } xssfWorkbook.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return resultList; } // 读取xls文件内容 public static List<List<String>> readXls(String path, int num) { List<List<String>> resultList = new ArrayList<List<String>>(); InputStream in; HSSFWorkbook hssfWorkbook; try { in = new FileInputStream(path); hssfWorkbook = new HSSFWorkbook(in); HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(num);// 获取当前页 if (hssfSheet != null) { for (int rowNum = 0; rowNum < hssfSheet.getLastRowNum() + 1; rowNum++) { HSSFRow hssfRow = hssfSheet.getRow(rowNum);// 获取行数据 int minColIX = hssfRow.getFirstCellNum();// 第一行数据 int maxColIX = hssfRow.getLastCellNum();// 总行数 List<String> rowList = new ArrayList<String>(); // 遍历该行,处理该行数据 for (int colIX = minColIX; colIX < maxColIX; colIX++) { HSSFCell cell = hssfRow.getCell(colIX);// 获取单元格 if (cell != null) { rowList.add(cell.toString()); } } resultList.add(rowList); } } hssfWorkbook.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return resultList; } }
图片合并,模拟插入电子公章
package com.gxuwz.zjh.util; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; /** * @author FangZenglin * @date 2023年10月13日15:30 */ @Component @Slf4j public class ChaGongZhang { public static String s = "i61PdAClDxIs/8/6iSGOQQ=="; public void chagongzhang_suodui(String path_biao,String path_gongzhang,String path_mubiao) { try { BufferedImage image1 = ImageIO.read(new File(path_biao)); BufferedImage image2 = ImageIO.read(new File(path_gongzhang)); // 加载公章 // BufferedImage image3 = ImageIO.read(new File(path_gongzhang.replace("1","2"))); int maxWidth = Math.max(image1.getWidth(), image2.getWidth()); int maxHeight = Math.max(image1.getHeight(), image2.getHeight()); BufferedImage combinedImage = new BufferedImage(maxWidth, maxHeight, BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = combinedImage.createGraphics(); g2d.drawImage(image1, 0, 0, null); // 计算第二张图片的位置 int x = 150; int y = 365;//所队部门意见 /** *int x = 480; *int y = 350;//人训部门意见 */ /** *int x = 780; *int y = 350;//单位主管领导 */ /** *int x = 1250; *int y = 350;//单位主要领导 */ g2d.drawImage(image2, x, y, null); // g2d.drawImage(image3, x, y, null); 公章插入 ImageIO.write(combinedImage, "png", new File(path_mubiao)); g2d.dispose(); log.info("图片合并成功!"); } catch (IOException e) { e.printStackTrace(); } } public void chagongzhang_renxun(String path_biao,String path_gongzhang,String path_mubiao) { try { // 加载第一张图片 BufferedImage image1 = ImageIO.read(new File(path_biao)); // 加载第二张图片 BufferedImage image2 = ImageIO.read(new File(path_gongzhang)); // 加载公章 // BufferedImage image3 = ImageIO.read(new File(path_gongzhang.replace("1","2"))); int maxWidth = Math.max(image1.getWidth(), image2.getWidth()); int maxHeight = Math.max(image1.getHeight(), image2.getHeight()); BufferedImage combinedImage = new BufferedImage(maxWidth, maxHeight, BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = combinedImage.createGraphics(); g2d.drawImage(image1, 0, 0, null); int x = 450; int y = 380;//人训部门意见 /** *int x = 780; *int y = 350;//单位主管领导 */ /** *int x = 1250; *int y = 350;//单位主要领导 */ g2d.drawImage(image2, x, y, null); // g2d.drawImage(image3, x, y, null); 公章插入 ImageIO.write(combinedImage, "png", new File(path_mubiao)); g2d.dispose(); log.info("图片合并成功!"); } catch (IOException e) { e.printStackTrace(); } } public void chagongzhang_zhuguanlingdao(String path_biao,String path_gongzhang,String path_mubiao) { try { // 加载第一张图片 BufferedImage image1 = ImageIO.read(new File(path_biao)); // 加载第二张图片 BufferedImage image2 = ImageIO.read(new File(path_gongzhang)); // 加载公章 // BufferedImage image3 = ImageIO.read(new File(path_gongzhang.replace("1","2"))); int maxWidth = Math.max(image1.getWidth(), image2.getWidth()); int maxHeight = Math.max(image1.getHeight(), image2.getHeight()); BufferedImage combinedImage = new BufferedImage(maxWidth, maxHeight, BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = combinedImage.createGraphics(); g2d.drawImage(image1, 0, 0, null); int x = 745; int y = 350;//单位主管领导 /** *int x = 1250; *int y = 350;//单位主要领导 */ g2d.drawImage(image2, x, y, null); // g2d.drawImage(image3, x, y, null); 公章插入 ImageIO.write(combinedImage, "png", new File(path_mubiao)); g2d.dispose(); log.info("图片合并成功!"); } catch (IOException e) { e.printStackTrace(); } } public void chagongzhang_zhuyaolingdao(String path_biao,String path_gongzhang,String path_mubiao) { try { // 加载第一张图片 BufferedImage image1 = ImageIO.read(new File(path_biao)); // 加载第二张图片 BufferedImage image2 = ImageIO.read(new File(path_gongzhang)); // 加载公章 // BufferedImage image3 = ImageIO.read(new File(path_gongzhang.replace("1","2"))); int maxWidth = Math.max(image1.getWidth(), image2.getWidth()); int maxHeight = Math.max(image1.getHeight(), image2.getHeight()); BufferedImage combinedImage = new BufferedImage(maxWidth, maxHeight, BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = combinedImage.createGraphics(); g2d.drawImage(image1, 0, 0, null); int x = 1215; int y = 350;//单位主要领导 g2d.drawImage(image2, x, y, null); // g2d.drawImage(image3, x, y, null); 公章插入 ImageIO.write(combinedImage, "png", new File(path_mubiao)); g2d.dispose(); log.info("图片合并成功!"); } catch (IOException e) { e.printStackTrace(); } } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。