实际上就是利用poi库一行一行画出来
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;
}
}