Apache poi风格设置在一段时间后停止

我想要做的是写一个程序,本质上是将图像转换为该图像的Excel表示。 我现在正在做的是,我正在加载图像,我得到的图像的RGB值成二维整数数组。

我面临的问题是这个。 我的细胞突然没有造型! 在一些背景颜色的单元格之后,剩下的部分留白,我不会超过4,000个样式的限制,因为我将图片限制为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; } } 

我的image processing程序类本质上是相同的,但我没有调整图像的大小。

这是我的“test.jpg”

在这里输入图像说明

下面是一个什么样的excel的样子(旋转旁边,我更关心的颜色,更复杂,它只是变成垃圾)

在这里输入图像说明

不完全确定我应该做什么

你的代码有很多错误:

  • 方向:你的两个x,y循环的顺序不一样,这就是为什么你得到一个旋转的图像
  • 你的RGB数据是一个int [3],但你可以使用[4] [5]来访问它……它甚至不应该运行!
  • 这是更多的风格,但避免在实例化之前声明variables
  • 也不需要使用一个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 }; } } }