续3:自己玩的图片转表格源码
发表于:2017-06-28 10:23:50 分类:JAVA 阅读:1094次
ExcelUtil.java
package top.ersredma.imagetoexcle; import java.awt.Color; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.FileReader; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.TreeSet; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFCellStyle; import org.apache.poi.xssf.usermodel.XSSFColor; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; /** * 本类用于将图像转存至表格文件 * * @author ersredma * */ public class ExcelUtil { public final static int MODEL_USER = 0; public final static int MODEL_64COLORS = 64; public final static int MODEL_2COLORS = 2; public final static int MODEL_FULLCOLORS = 3375; private XSSFCellStyle defuStyle; private Map<String, XSSFCellStyle> bigColorMap = null; private Map<String, String> userMap = null; private static Set<String> setRgb = null; private XSSFWorkbook workbook = null; private static int x = 15; private int overThreadnum = 0; private boolean isInnt = false; private boolean isOpenThread = false; private MainView view; public ExcelUtil() { this.workbook = new XSSFWorkbook(); bigColorMap = new ConcurrentHashMap<String, XSSFCellStyle>(3375); defuStyle = workbook.createCellStyle(); XSSFColor xc = new XSSFColor(new byte[] { (byte) 255, (byte) 255, (byte) 255 }); defuStyle.setFillForegroundColor(xc); defuStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); } public ExcelUtil(int model, MainView view, boolean openThread) { this.workbook = new XSSFWorkbook(); this.view = view; this.isOpenThread = openThread; defuStyle = workbook.createCellStyle(); XSSFColor xc = new XSSFColor(new byte[] { (byte) 255, (byte) 255, (byte) 255 }); defuStyle.setFillForegroundColor(xc); defuStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); if (model == MODEL_USER) { // 自定义色,从表格导入 bigColorMap = new ConcurrentHashMap<String, XSSFCellStyle>(); x = 0; } else if (model == MODEL_2COLORS) { // 黑白色 bigColorMap = new ConcurrentHashMap<String, XSSFCellStyle>(2); x = -1; } else if (model == MODEL_FULLCOLORS) { x = 15; bigColorMap = new ConcurrentHashMap<String, XSSFCellStyle>(model); } else { x = (int) Math.cbrt(model); bigColorMap = new ConcurrentHashMap<String, XSSFCellStyle>(model); } } public static void main(String[] args) { long start = System.currentTimeMillis(); // int[][][] grbs = ImageUtils.getImageGRB("D:\\imgs\\mm.jpg"); ExcelUtil eu = new ExcelUtil(); // eu.inntColorsForThread(); eu.createColorStyles(); // eu.writeToFile(grbs, "D:\\imgs",false); // eu.exportRgbsToExcelFor2007(grbs, "D:\\rgbs.xlsx"); // eu.allColorToFile("D:\\allcolornew1.xlsx"); // int size = getRgbSet(grbs); System.out.println("耗时(ms):" + (System.currentTimeMillis() - start)); } /** * 获取工作表 * * @return 当前对象的工作薄 */ public XSSFWorkbook getWorkbook() { return this.workbook; } /** * 返回当前颜色初始化是否结束 * * @return */ public boolean isInnt() { return isInnt; } /** * 将rgbs信息写入2007版表格的封装方法 * * @param rgbs * out的rgb信息 * @param outputFilePath * 文件输出路径 */ public void writeToFile(int[][][] rgbs, String outputFilePath, boolean isColor) { while (!isInnt) { try { Thread.sleep(10000); System.out.println("等待载入颜色信息"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } exportRgbToExcelFor2007(rgbs, outputFilePath, isColor); } /** * outrgb信息转存xlsx表格文件 (2007版) * * @param rgbs * out的rgb数组 * @param outputFilePath * 输出路径 * @param isColor */ private void exportRgbToExcelFor2007(int[][][] rgbs, String outputFilePath, boolean isColor) { try { XSSFSheet sheet; if (workbook.getSheet("out") == null) { sheet = workbook.createSheet("out"); } else { sheet = workbook.getSheet("out"); } sheet.setDefaultColumnWidth(10000); sheet.setDefaultRowHeightInPoints(4000f); for (int i = 0; i < rgbs.length; i++) { XSSFRow row = sheet.createRow(i); for (int j = 0; j < rgbs[i].length; j++) { XSSFCell cell = row.createCell(j); String key = getKeyForStyleMap(rgbs[i][j]); cell.setCellStyle(bigColorMap.get(key)); if (isColor) { cell.setCellValue(key); } } } SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss"); String Str = formatter.format(new Date()); // 5、输出 FileOutputStream out = new FileOutputStream(new File(outputFilePath + "\\" + Str + ".xlsx")); workbook.write(out); out.close(); view.writeOver(outputFilePath + "\\" + Str + ".xlsx"); resetWorkbook(rgbs.length, rgbs[0].length); } catch (Exception e) { e.printStackTrace(); } } /** * 恢复工作薄到空白状态 * * @param x * 宽 * @param y * 高 */ private void resetWorkbook(int x, int y) { /*XSSFSheet sheet = workbook.getSheet("out"); for (int i = 0; i < x; i++) { XSSFRow row = sheet.createRow(i); for (int j = 0; j < y; j++) { XSSFCell cell = row.createCell(j); cell.setCellStyle(defuStyle); } }*/ int index = workbook.getSheetIndex("out"); workbook.removeSheetAt(index); } public void initColors() { new Thread(new Runnable() { @Override public void run() { createColorStyles(); } }).start(); try { while (!isInnt()) { view.setInfo("正在初始化颜色,请等待完成后再开始导出! " + overThreadnum + "/" + x); TimeUnit.MILLISECONDS.sleep(1000); } TimeUnit.MILLISECONDS.sleep(1000); view.setInfo("初始化颜色完成,可以导出!"); } catch (InterruptedException e) { } } /** * 创建所有的颜色并存入map中 */ public void createColorStyles() { if (x == 0) { readConfigCreateStyles(); isInnt = true; } else if (x == -1) { XSSFCellStyle blackStyle = workbook.createCellStyle(); XSSFColor black = new XSSFColor(Color.black); blackStyle.setFillForegroundColor(black); blackStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); XSSFCellStyle whiteStyle = workbook.createCellStyle(); XSSFColor white = new XSSFColor(Color.white); whiteStyle.setFillForegroundColor(white); whiteStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); bigColorMap.put("black", blackStyle); bigColorMap.put("white", whiteStyle); isInnt = true; } else { if (!isOpenThread) { for (int r = 0; r < x; r++) { for (int g = 0; g < x; g++) { for (int b = 0; b < x; b++) { XSSFCellStyle style = workbook.createCellStyle(); XSSFColor xc = new XSSFColor(new byte[] { (byte) (r != (x - 1) ? r * (255 / (x - 1)) : 255), (byte) (g != (x - 1) ? g * (255 / (x - 1)) : 255), (byte) (b != (x - 1) ? b * (255 / (x - 1)) : 255) }); style.setFillForegroundColor(xc); style.setFillPattern(CellStyle.SOLID_FOREGROUND); StringBuilder sb = new StringBuilder(); bigColorMap.put(sb.append(r).append(",").append(g) .append(",").append(b).toString(), style); } } threadOver(); } } else { inntColorsForThread(); } } Thread.yield(); } public void readConfigCreateStyles() { userMap = new HashMap<String, String>(); BufferedReader sc=null; try { sc=new BufferedReader(new FileReader(new File("config/user.color"))); String line=null; while ((line=sc.readLine())!=null) { if (!line.startsWith("*")) { String[] sp = line.split(":"); XSSFCellStyle style = workbook.createCellStyle(); String[] rgbs = sp[0].split(","); XSSFColor color = new XSSFColor(new Color( Integer.parseInt(rgbs[0]), Integer.parseInt(rgbs[1]), Integer.parseInt(rgbs[2]))); style.setFillForegroundColor(color); style.setFillPattern(CellStyle.SOLID_FOREGROUND); userMap.put(sp[0], sp[1]); bigColorMap.put(sp[1], style); } } sc.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); view.setInfo("自定义颜色配置文件出错!"); } } /** * * @param rgb * @return 根据当前的rgb计算出的对应map的key */ private String getKeyForStyleMap(int[] rgb) { if (x == 0) { int tempNum = 1000; String keyS = ""; for (String str : userMap.keySet()) { String[] sp = str.split(","); int x = Math.abs(rgb[0] - Integer.parseInt(sp[0])) + Math.abs(rgb[1] - Integer.parseInt(sp[1])) + Math.abs(rgb[2] - Integer.parseInt(sp[2])); if (x < tempNum) { tempNum = x; keyS = str; } } return userMap.get(keyS); } else if (x == -1) { if (rgb[0] + rgb[1] + rgb[2] > 380) { return "white"; } else { return "black"; } } else { int r = rgb[0] % (255 / (x - 1)) > (255 / (x - 1)) / 2 ? rgb[0] / (255 / (x - 1)) + 1 : rgb[0] / (255 / (x - 1)); int g = rgb[1] % (255 / (x - 1)) > (255 / (x - 1)) / 2 ? rgb[1] / (255 / (x - 1)) + 1 : rgb[1] / (255 / (x - 1)); int b = rgb[2] % (255 / (x - 1)) > (255 / (x - 1)) / 2 ? rgb[2] / (255 / (x - 1)) + 1 : rgb[2] / (255 / (x - 1)); return new StringBuilder().append(r).append(",").append(g) .append(",").append(b).toString(); } } public int getRgbSet(int[][][] rgbs) { setRgb = new HashSet<String>(); for (int i = 0; i < rgbs.length; i++) { for (int j = 0; j < rgbs[i].length; j++) { setRgb.add(new StringBuilder().append(rgbs[i][j][0]) .append(",").append(rgbs[i][j][1]).append(",") .append(rgbs[i][j][2]).toString()); } } return setRgb.size(); } public void allColorToFile(String outputFilePath) { while (!isInnt) { try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } XSSFSheet sheet = workbook.createSheet("out"); sheet.setDefaultColumnWidth(1); sheet.setDefaultRowHeightInPoints(1); Set<String> keySet = bigColorMap.keySet(); Set<String> treeSet = new TreeSet<>(keySet); int i = 0; int j = 0; XSSFRow row = null; for (String str : treeSet) { if (i % 10 == 0) { row = sheet.createRow(i / 10); j = 0; } XSSFCell cell = row.createCell(j++); cell.setCellStyle(bigColorMap.get(str)); cell.setCellValue(str); i++; } // 5、输出 FileOutputStream out; try { out = new FileOutputStream(new File(outputFilePath)); workbook.write(out); out.close(); sheet = workbook.getSheet("out"); i = 0; j = 0; row = null; for (String str : treeSet) { if (i % 10 == 0) { row = sheet.createRow(i / 10); j = 0; } XSSFCell cell = row.createCell(j++); cell.setCellStyle(defuStyle); cell.setCellValue(""); i++; } // workbook.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } private void inntColorsForThread() { for (int i = 0; i < 15; i++) { InntColorsThread run = new InntColorsThread(i, this); new Thread(run).start(); } } public void addColors(Map<String, XSSFCellStyle> colorMap) { this.bigColorMap.putAll(colorMap); overThreadnum++; if (overThreadnum == 15) { isInnt = true; } } public void addColor(String key, XSSFCellStyle colorStyle) { this.bigColorMap.put(key, colorStyle); } public void threadOver() { overThreadnum++; if (overThreadnum == x) { isInnt = true; } } public int getOvers() { return overThreadnum; } }
关键词:java,poi,表格,图像