excel转换成图片

这个是某位大神写的,我拿来参考的,虽然最后没用上,不过还是记录一下

package ibp.common.report;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;

import javax.imageio.ImageIO;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.ss.usermodel.CellStyle;
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.XSSFFont;

import sun.awt.SunHints;

public class TransToImgUtil {
    public static ByteArrayOutputStream FromExcelToImg(Workbook wb,String sheetName) throws Exception{

        // 给定两个初始值,标志出导出区域,两个行列组合的单元格
        int[] fromIndex = { 0, 0 };
        int[] toIndex = { 17, 3 };

        int imageWidth = 0;
        int imageHeight = 0;
        Sheet sheet = wb.getSheet(sheetName);
        List<CellRangeAddress> rangeAddress = sheet.getMergedRegions(); // 获取整个sheet中合并单元格组合的集合

        // 首先做初步的边界检测,如果指定区域是不合法的则抛出异常
        int rowSum = sheet.getPhysicalNumberOfRows();
        int colSum = sheet.getRow(0).getPhysicalNumberOfCells();
        if (fromIndex[0] > rowSum || fromIndex[0] > toIndex[0] || toIndex[0] > rowSum) {
            throw new Exception("the rowIndex of the area is wrong!");
        }
        if (fromIndex[1] > colSum || fromIndex[1] > toIndex[1] || toIndex[1] > colSum) {
            throw new Exception("the colIndex of the area is wrong!");
        }

        // 计算实际需要载入内存的二维Cell数组的大小,剔除隐藏行列
        int rowSize = toIndex[0]+1;
        int colSize = toIndex[1]+1;

        // 遍历需要扫描的区域

        UserCell[][] cells = new UserCell[rowSize][colSize];
        int[] rowPixPos = new int[rowSize + 1];
        rowPixPos[0] = 0;
        int[] colPixPos = new int[colSize + 1];
        colPixPos[0] = 0;
        for (int i = 0; i < rowSize; i++) {

            for (int j = 0; j < colSize; 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=(i>=fromIndex[0]) && (j>=fromIndex[1]);    //首先行列要在指定区域之间
                ifShow=ifShow && !(sheet.isColumnHidden(j) || sheet.getRow(i).getZeroHeight()); //其次行列不可以隐藏
                cells[i][j].setShow(ifShow);

                // 计算所求区域宽度
                float widthPix = !ifShow ? 0 : sheet.getColumnWidthInPixels(j); // 如果该单元格是隐藏的,则置宽度为0
                if (i == fromIndex[0]) {
                    imageWidth += widthPix;
                }

                colPixPos[j+1] = (int) (widthPix * 1.15 + colPixPos[j]);

            }

            // 计算所求区域高度
            boolean ifShow=(i>=fromIndex[0]);    //行序列在指定区域中间
            ifShow=ifShow && !sheet.getRow(i).getZeroHeight();  //行序列不能隐藏
            float heightPoint = !ifShow ? 0 : sheet.getRow(i).getHeightInPoints(); // 如果该单元格是隐藏的,则置高度为0
            imageHeight += heightPoint;
            rowPixPos[i+1] = (int) (heightPoint * 96 / 72) + rowPixPos[i];

        }

        imageHeight = imageHeight * 96 / 72;
        imageWidth = imageWidth * 115 / 100;

        wb.close();

        List<Grid> grids = new ArrayList<Grid>();
        for (int i = 0; i < rowSize; i++) {
            for (int j = 0; j < colSize; 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]>rowSize-1?rowSize-1:isInMergedStatus[0];
                    int lastColPos=isInMergedStatus[1]>colSize-1?colSize-1:isInMergedStatus[1];                 

                    grid.setWidth(colPixPos[lastColPos + 1] - colPixPos[j]);
                    grid.setHeight(rowPixPos[lastRowPos + 1] - rowPixPos[i]);

                }

                // 单元格背景颜色
                CellStyle cs = cells[i][j].getCell().getCellStyle();
                if (cs.getFillPattern() == CellStyle.SOLID_FOREGROUND)
                    grid.setBgColor(cells[i][j].getCell().getCellStyle().getFillForegroundColorColor());

                // 设置字体
                org.apache.poi.ss.usermodel.Font font = wb.getFontAt(cs.getFontIndex());
                grid.setFont(font);

                // 设置字体前景色
                if (font instanceof XSSFFont) {
                    XSSFFont xf = (XSSFFont) font;

                    grid.setFtColor(xf.getXSSFColor());
                }

                // 设置文本
                String strCell = "";
                switch (cells[i][j].getCell().getCellType()) {
                case HSSFCell.CELL_TYPE_NUMERIC:
                    strCell = String.valueOf(cells[i][j].getCell().getNumericCellValue());
                    break;
                case HSSFCell.CELL_TYPE_STRING:
                    strCell = cells[i][j].getCell().getStringCellValue();
                    break;
                case HSSFCell.CELL_TYPE_BOOLEAN:
                    strCell = String.valueOf(cells[i][j].getCell().getBooleanCellValue());
                    break;
                case HSSFCell.CELL_TYPE_FORMULA:

                    try {
                        strCell = String.valueOf(cells[i][j].getCell().getNumericCellValue());
                    } catch (IllegalStateException e) {
                        strCell = String.valueOf(cells[i][j].getCell().getRichStringCellValue());
                    }
                    break;
                default:
                    strCell = "";
                }

                if(cells[i][j].getCell().getCellStyle().getDataFormatString().contains("0.00%")){
                    try{
                        double dbCell=Double.valueOf(strCell);
                        strCell=new DecimalFormat("#.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.setRenderingHint(SunHints.KEY_ANTIALIASING, SunHints.VALUE_ANTIALIAS_OFF);
        g2d.setRenderingHint(SunHints.KEY_TEXT_ANTIALIASING, SunHints.VALUE_TEXT_ANTIALIAS_DEFAULT);
        g2d.setRenderingHint(SunHints.KEY_STROKE_CONTROL, SunHints.VALUE_STROKE_DEFAULT);
        g2d.setRenderingHint(SunHints.KEY_TEXT_ANTIALIAS_LCD_CONTRAST, 140);
        g2d.setRenderingHint(SunHints.KEY_FRACTIONALMETRICS, SunHints.VALUE_FRACTIONALMETRICS_OFF);
        g2d.setRenderingHint(SunHints.KEY_RENDERING, SunHints.VALUE_RENDER_DEFAULT);

        g2d.setColor(Color.white);
        g2d.fillRect(0, 0, imageWidth, imageHeight);

        // 绘制表格
        for (Grid g : grids) {
            if (!g.isShow())
                continue;

            // 绘制背景色
            g2d.setColor(g.getBgColor() == null ? Color.white : g.getBgColor());
            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();
            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.dispose();
        ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
        ImageIO.write(image, "png", new File("D:/temp/test.png"));
        return byteArrayOut;
    }
    /**
     * 判断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;
    }
}
package ibp.common.report;

import java.awt.Color;

import org.apache.poi.ss.usermodel.Cell;

public class UserCell implements Comparable<UserCell>{
    private Cell cell;
    private int row;
    private int col;
    private boolean show;
    private String text="";
    private Color   color=null;

    public Cell getCell() {
        return cell;
    }
    public void setCell(Cell cell) {
        this.cell = cell;
    }
    public int getRow() {
        return row;
    }
    public void setRow(int row) {
        this.row = row;
    }
    public int getCol() {
        return col;
    }
    public void setCol(int col) {
        this.col = col;
    }
    public boolean isShow() {
        return show;
    }
    public void setShow(boolean show) {
        this.show = show;
    }
    public String getText() {
        return text;
    }
    public void setText(String text) {
        this.text = text;
    }

    public Color getColor() {
        return color;
    }
    public void setColor(Color color) {
        this.color = color;
    }
    @Override
    public int compareTo(UserCell uc) {
        try{
            double meDouble=Double.parseDouble(this.getText().replaceAll("%", ""));
            double heDouble=Double.parseDouble(uc.getText().replaceAll("%", ""));
            if(meDouble<heDouble)
                return - 1;
            else if(meDouble>heDouble)
                return  1;
        }catch(Exception e){}

        return  0;
    }
}
package ibp.common.report;

import java.awt.Color;
import java.awt.Font;

import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.xssf.usermodel.XSSFColor;

public class Grid {
    private boolean show;
    private int row;    //对应Excel中的row,也可以理解为cells[i][j]的i
    private int col;    //对应Excel中的col,也可以理解为cells[i][j]的j
    private int x;  //x坐标
    private int y;  //y坐标
    private int width;
    private int height;
    private String text;
    private java.awt.Font font=new Font("微软雅黑",Font.PLAIN, 12);
    private java.awt.Color bgColor=null;
    private java.awt.Color ftColor=null;
    public int getRow() {
        return row;
    }
    public void setRow(int row) {
        this.row = row;
    }
    public int getCol() {
        return col;
    }
    public void setCol(int col) {
        this.col = col;
    }
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }
    public boolean isShow() {
        return show;
    }
    public void setShow(boolean show) {
        this.show = show;
    }
    public int getWidth() {
        return width;
    }
    public void setWidth(int width) {
        this.width = width;
    }
    public int getHeight() {
        return height;
    }
    public void setHeight(int height) {
        this.height = height;
    }
    public String getText() {
        return text;
    }
    public void setText(String text) {
        this.text = text;
    }
    public Color getBgColor() {
        return bgColor;
    }

    /**
     * 将poi.ss.usermodel.Color 转换成  java.awt.Color
     * <a href="http://home.cnblogs.com/u/309701/" target="_blank">@param</a> color
     */
    public void setBgColor(org.apache.poi.ss.usermodel.Color color) {
        this.bgColor=poiColor2awtColor(color);
    }

    public void setBgColor(java.awt.Color color){
        this.bgColor=color;
    }

    public Color getFtColor() {
        return ftColor;
    }
    public void setFtColor(org.apache.poi.ss.usermodel.Color color) {
        this.ftColor = poiColor2awtColor(color);
    }

    public Font getFont() {
        return font;
    }
    public void setFont(org.apache.poi.ss.usermodel.Font font) {
        if(font!=null){
            this.font=new java.awt.Font(font.getFontName(),Font.BOLD,font.getFontHeight()/ 20+  2);
        }
    }

    private java.awt.Color poiColor2awtColor(org.apache.poi.ss.usermodel.Color color){
        java.awt.Color awtColor=null;
        if(color instanceof XSSFColor){     //.xlsx
            XSSFColor xc=(XSSFColor) color;
            String rgbHex=xc.getARGBHex();
            if(rgbHex!=null){
                awtColor=new Color(Integer.parseInt(rgbHex.substring(  2),  16));
            }
        }else if(color instanceof HSSFColor){   //.xls
            HSSFColor hc=(HSSFColor) color;
            short[] s=hc.getTriplet();
            if(s!=null){
                awtColor=new Color(s[  0],s[  1],s[  2]);
            }
        }
        return awtColor;
    }
}
时间: 2024-10-16 16:39:40

excel转换成图片的相关文章

pdf文件内容如何转换成图片

在将pdf文件或者是word文档转换成为图片时,一般的方法都是讲如何使用截图的方式来把文档内容转换成图片,但是除此之外,还有什么方法可以把pdf以及office文档转换成图片吗? 如果只是将pdf文件转成图片,可以用在线工具把pdf文档的内容转换成图片的形式,这在一些专门的pdf在线转换应用中可以实现. 首先找到在线pdf转图片,并进入到首页.在首页中会有pdf转成图片的选项,直接选择该项,进入到转换的操作页面. 点选择文件,然后就可以在选择一个需要进行转换的pdf文档,选择的文件会添加到转换页

批量将网页转换成图片或PDF文档技巧分享

工作中我们有时要将一些批量的网页转换成图片或者PDF文档格式,虽然多数浏览器具有滚动截屏或者打印输出PDF文档功能,但是如果有几十上百张网页需要处理,那也是要人命的.所以我一直想找一款能够批量处理该工作的软件,但基本都是收费的,即便是收费的功能也一般.终于,我找到了wkhtmltopdf这款免费开源软件,最贴合我的工作,由衷感谢软件的作者"Jakob Truelsen"和"Ashish Kulkarni"两位大神!我安装软件后,结合windows的批处理命令,顺利测

PDF怎么转换成图片格式:手把手教你学会

PDF文件是一中安全性比较高的文件在办公中也是经常能够用到的,它不仅安全性高,而且也很难进行编辑,而图片格式确是一种很容易进行编辑的,想要将PDF转换成图片格式并非是一件难事,那么PDF怎么转换成图片格式,想知道的话就跟着下面的文章继续往下看吧,手把手教你学会.PDF怎么转换成图片格式?下面是PDF转换成图片的案例演示:借助软件:迅捷PDF转换器步骤一:首先先将迅捷PDF转换器下载到电脑中去,之后可双击运行软件步骤二:进入到软件的功能页面,可点击"PDF转成其他文件"点击下方的&quo

简单三步学会如何将excel转换成word

对于Excel和Word之间的转换问题,我们需要下载一款叫迅捷的PDF转换器,它可以帮我们解决这个问题.对于专业的事情就用该交给专业的软件来做,社会分工越来越精细化,时间就是金钱,语气自己浪费时间做笨功夫,不如用这个时间去做你擅长的有价值的事情,然后把这件事交给别人. 操作非常简单,只用三步就完成了:     1.首先下载安装迅捷PDF转换软件,双击打开软件,在软件左侧选择要转换的类型"文件转Word",然后点击上面的"添加文件"按钮,在弹出的界面上选择要转换的Ex

20140526-一个从pdf转换成图片的类,工作当中有用到

20140526-一个从pdf转换成图片的类,工作当中有用到 package com.jako.database.model; import java.awt.Image; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import

.net excel 转换成datatable,创建文件夹

protected void Button9_Click(object sender, EventArgs e) { string path = ""; path = FileUpload3.PostedFile.FileName; if (path == "") { string jss = "<script language='javascript' type='text/javascript'> alert('先选择文件')</sc

C# 字节流通过Base64编码转换成图片代码

C# 字节流通过Base64编码转换成图片代码 // 需载入以下的命名空间 // using System.IO; // using System.Drawing; // using System.Runtime.Serialization.Formatters.Binary; protected void Page_Load(object sender, EventArgs e) { byte[] buffer = ReadFile(Server.MapPath(@"\sex.txt"

C#技术分享【PDF转换成图片——13种方案】(2013-07-25重新整理)

原文:C#技术分享[PDF转换成图片--13种方案](2013-07-25重新整理) 重要说明:本博已迁移到 石佳劼的博客,有疑问请到 文章新地址 留言!!! 写在最前面:为了节约大家时间,撸主把最常用的方法写在第一条,如果不满足您的需要,您可以继续往后看. 如果看完全文还是不能解决您的问题,欢迎加撸主的QQ群(274281457)进行讨论. 木有csdn分的童鞋,可以去github clone,地址:https://github.com/stone0090/OfficeTools.Pdf2Im

Android View转换成图片保存

package zhangphil.viewtoimage; import java.io.File; import java.io.FileOutputStream; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.view.View; import android.widget.Button; import android.widget.Tex