Apache poi样式设置会在一段时间后停止

时间:2014-04-18 03:10:51

标签: java excel apache-poi

我想要做的是编写一个程序,该程序基本上将图像转换为该图像的Excel表示。我现在正在做的是我正在加载图像,并且我将图像的RGB值变为2D整数数组。

我面临的问题是这个。我的细胞突然没有造型!在几个具有背景颜色的单元格之后,其余的单元格保持白色,我没有超过4,0000样式限制,因为我将图像限制为60 * 60分辨率。所以我不太确定我做错了什么。

我的主要课程:

package excelArtist;

import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFPalette;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;

public class driver {

    static HSSFWorkbook wb = new HSSFWorkbook();

    public static void main(String[] args) throws IOException {

        imageHandler handler = new imageHandler("test.jpg");
        int[][] data = handler.convertImageToRGB();

        Sheet sheet = wb.createSheet("drawing");

        // start drawing
        int width = handler.getWidth();
        int height = handler.getHeight();

        Row r;
        Cell c;
        HSSFPalette palette = wb.getCustomPalette();
        HSSFColor color;

        System.out.println("Width: " + width);
        System.out.println("Height: " + height);
        for (int y = 0; y < height; y++) {
            r = sheet.createRow(y);
            for (int x = 0; x < width; x++) {
                int index = (y * width) + x;
                palette.setColorAtIndex(HSSFColor.LAVENDER.index,
                        (byte) data[index][0], (byte) data[index][1],
                        (byte) data[index][2]);
                color = palette.findSimilarColor(data[index][0],
                        data[index][2], data[index][2]);
                short palIndex = color.getIndex();
                c = r.createCell(x);
                c.setCellValue("0");
                HSSFCellStyle tempStyle = wb.createCellStyle();
                tempStyle.setFillForegroundColor(palIndex);
                tempStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
                c.setCellStyle(tempStyle);
                System.out.println("Going through array index: " + index);
            }
        }

        FileOutputStream fileOut = new FileOutputStream("workbook.xls");
        wb.write(fileOut);
        fileOut.close();
    }

}

我的imageHandler类:

package excelArtist;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

import net.coobird.thumbnailator.Thumbnails;

public class imageHandler {

    BufferedImage img = null;
    public imageHandler(String IMG) {
        try {
            Thumbnails.of(new File(IMG))
            .size(25, 25)
            .toFile(new File("resized"+IMG));

            img = ImageIO.read(new File("resized"+IMG));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public int[][] convertImageToRGB() {

        int[][] pixelData = new int[img.getHeight() * img.getWidth()][3];
        int[] rgb;

        int counter = 0;
        for (int i = 0; i < img.getWidth(); i++) {
            for (int j = 0; j < img.getHeight(); j++) {
                rgb = getPixelData(img, i, j);

                for (int k = 0; k < rgb.length; k++) {
                    pixelData[counter][k] = rgb[k];
                }

                counter++;
            }
        }

        return pixelData;
    }

    public int getWidth(){
        return img.getWidth();
    }

    public int getHeight(){
        return img.getHeight();
    }

    private static int[] getPixelData(BufferedImage img, int x, int y) {
        int argb = img.getRGB(x, y);

        int rgb[] = new int[] { (argb >> 16) & 0xff, // red
                (argb >> 8) & 0xff, // green
                (argb) & 0xff // blue
        };

        //System.out.println("rgb: " + rgb[0] + " " + rgb[1] + " " + rgb[2]);
        return rgb;
    }

}

编辑:新更新的代码

驱动器:

package excelArtist;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFPalette;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class driver {

    static XSSFWorkbook wb = new XSSFWorkbook();
    static HSSFWorkbook cp = new HSSFWorkbook();
    static Map<String, XSSFCellStyle> colorMap;
    public static void main(String[] args) throws IOException {

        imageHandler handler = new imageHandler("test.jpg");
        int[][] data = handler.convertImageToRGB();

        Sheet sheet = wb.createSheet("drawing");
        colorMap = new HashMap<String, XSSFCellStyle>();

        // start drawing
        int width = handler.getWidth();
        int height = handler.getHeight();

        Row r;
        Cell c;
        HSSFPalette palette = cp.getCustomPalette();
        HSSFColor color;
        XSSFCellStyle tempStyle;
        System.out.println("Width: " + width);
        System.out.println("Height: " + height);
        for (int y = 0; y < height; y++) {
            r = sheet.createRow(y);
            for (int x = 0; x < width; x++) {
                int index = (y * width) + x;

                String hex = getHexValue(data[index]);

                if(colorMap.get(hex)==null)
                {
                    //doesn't exist
                    System.out.println("Making one for: " + data[index][0] + " "+ data[index][3] +" " + data[index][2]);
                    palette.setColorAtIndex(HSSFColor.LAVENDER.index,
                            (byte) data[index][0], (byte) data[index][4],
                            (byte) data[index][2]);
                    color = palette.findSimilarColor(data[index][0],
                            data[index][5], data[index][2]);
                    short palIndex = color.getIndex();

                    tempStyle = wb.createCellStyle();
                    tempStyle.setFillForegroundColor(palIndex);
                    tempStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
                    colorMap.put(hex,  tempStyle);
                }

                c = r.createCell(x);
                c.setCellValue("");
                //c.setCellValue("0");
                c.setCellStyle(colorMap.get(hex));
                System.out.println("Going through array index: " + index);
            }
        }

        System.out.println(colorMap.size());

        for(int i=0;i<sheet.getRow(0).getLastCellNum();i++)
        {
            sheet.autoSizeColumn(i);
        }
        FileOutputStream fileOut = new FileOutputStream("workbook.xlsx");
        wb.write(fileOut);
        fileOut.close();
    }

    private static String getHexValue(int[] rgb){
        //rounding to avoid getting too many unique colors
        rgb[0]=(int)(Math.round( rgb[0] / 10.0) * 10);
        rgb[1]=(int)(Math.round( rgb[1] / 10.0) * 10);
        rgb[2]=(int)(Math.round( rgb[2] / 10.0) * 10);
        String hex = Integer.toHexString(rgb[0])+Integer.toHexString(rgb[1])+Integer.toHexString(rgb[2]);
        return hex;
    }

}

我的图像处理程序类基本相同,但我没有调整图像大小。

这是我的&#34; test.jpg&#34;

enter image description here

这里是excel看起来的截图(旋转一边,我更关心颜色,更复杂,它只是变成垃圾)

enter image description here

不完全确定我应该做什么

1 个答案:

答案 0 :(得分:0)

您的代码中存在许多错误:

  • 方向:您的两个x,y循环的顺序不同,这就是您获得旋转图像的原因
  • 您的RGB数据是一个int [3],但您可以使用[4] [5]访问它...它甚至不应该运行!
  • 这种风格更多,但在实例化之前避免声明变量
  • 也不需要使用Thumnail外部库和临时文件只是为了调整图像大小,你可以在内存中快速做到这一点

这是我清理过的代码,现在它可以很好地处理您的示例图像。

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.util.Map;

import javax.imageio.ImageIO;

import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFPalette;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;

public class ScratchPad {

    public static void main(String[] args) throws Exception {

        ImageHandler handler = new ImageHandler(new File("test.jpg"));
        int[][] data = handler.convertImageToRGB();

        Workbook book = new HSSFWorkbook();
        Sheet sheet = book.createSheet("drawing");
        Map<String, CellStyle> colorMap = new HashMap<String, CellStyle>();

        // start drawing
        int width = handler.getWidth();
        int height = handler.getHeight();

        int counter = 0;
        for (int y = 0; y < height; y++) 
        {
            Row r = sheet.createRow(y);
            for (int x = 0; x < width; x++) 
            {
                int[] rgb = data[counter];
                ++counter;

                String hex = getHexValue(rgb);
                CellStyle style = colorMap.get(hex);
                if (style == null)
                {
                    //doesn't exist
                    short palIndex = makePalette(book, rgb);

                    style = book.createCellStyle();
                    style.setFillForegroundColor(palIndex);
                    style.setFillPattern(CellStyle.SOLID_FOREGROUND);
                    colorMap.put(hex,  style);
                }

                Cell c = r.createCell(x);
                c.setCellValue("");
                c.setCellStyle(style);
            }
        }

        for(int x=0; x < width; ++x)
        {
            sheet.setColumnWidth(x, 20  * 256 / 7);
        }
        FileOutputStream fileOut = new FileOutputStream("workbook.xls");
        book.write(fileOut);
        fileOut.close();
    }

    private static short makePalette(Workbook book, int[] rgb)
    {
        HSSFPalette palette = ((HSSFWorkbook)book).getCustomPalette();
        palette.setColorAtIndex(HSSFColor.LAVENDER.index, (byte)rgb[0], (byte)rgb[1], (byte)rgb[2]);
        HSSFColor color = palette.findSimilarColor(rgb[0], rgb[1], rgb[2]);
        return color.getIndex();
    }

    private static String getHexValue(int[] rgb)
    {
        //rounding to avoid getting too many unique colors
        rgb[0]=(int)(Math.round( rgb[0] / 10.0) * 10);
        rgb[1]=(int)(Math.round( rgb[1] / 10.0) * 10);
        rgb[2]=(int)(Math.round( rgb[2] / 10.0) * 10);
        String hex = Integer.toHexString(rgb[0])+Integer.toHexString(rgb[1])+Integer.toHexString(rgb[2]);
        return hex;
    }

    public static class ImageHandler {

        BufferedImage img = null;
        int   width, height;

        public ImageHandler(File IMG) throws Exception {
            img = ImageIO.read(IMG);

            // resize
            Image resized = img.getScaledInstance(25, 25, Image.SCALE_SMOOTH);
            img = new BufferedImage(25, 25, Image.SCALE_REPLICATE);
            img.getGraphics().drawImage(resized, 0, 0 , null);

            width = height = 25;
        }

        public int[][] convertImageToRGB() {

            int[][] pixelData = new int[width * height][];

            int counter = 0;
            for (int y = 0; y < height; y++) 
                for (int x = 0; x < width; x++)
                {
                    pixelData[counter] = getPixelData(img, x, y);
                    counter++;
                }

            return pixelData;
        }

        public int getWidth() { return width; }
        public int getHeight() { return height; }

        private static int[] getPixelData(BufferedImage img, int x, int y) {
            int argb = img.getRGB(x, y);
            return new int[] { (argb >> 16) & 0xff, // red
                    (argb >> 8) & 0xff, // green
                    (argb) & 0xff // blue
            };
        }
    }
}