ZGY的Excel特征提取器初期版本完成

其实这个初期版本已经基本上把他要的功能都实现了,呵呵

他的要求是批量转Excel,把所有用黄色标出的单元格所在的列拷到一个新文件中

其实底层很简单,界面做了倒有一会,还是一如既往的喜欢SWT啊~

附上Java利用Apache POI进行Excel文件的转换的核心代码。可能算法上不是很好,但数据量也不是很大。

 

  1ExpandedBlockStart.gifContractedBlock.gifpublic static HSSFWorkbook convert(HSSFWorkbook wb,byte[] rgb){    
  2        short high = wb.getCustomPalette().findSimilarColor(rgb[0], rgb[1], rgb[2]).getIndex();
  3        HSSFWorkbook dest = new HSSFWorkbook();
  4        FormulaEvaluator fe = wb.getCreationHelper().createFormulaEvaluator();
  5        
  6        Sheet sheet = wb.getSheetAt(0);
  7        HashSet<Integer> toCopyColumns = new HashSet<Integer>();
  8        
  9        Cell copyHighCell = null;
 10        Cell copyNormalCell = null;
 11        CellStyle csHigh;
 12        CellStyle csNormal;
 13        //read row
 14ExpandedSubBlockStart.gifContractedSubBlock.gif        for (Row row:sheet){
 15ExpandedSubBlockStart.gifContractedSubBlock.gif            for (Cell cell :row){
 16                //find high lighted cell
 17ExpandedSubBlockStart.gifContractedSubBlock.gif                if (cell.getCellStyle().getFillForegroundColor() == high){
 18                    //hit
 19                    toCopyColumns.add(cell.getColumnIndex());
 20                    copyHighCell = cell;
 21ExpandedSubBlockStart.gifContractedSubBlock.gif                }
else{
 22                    copyNormalCell = cell;
 23                }

 24            }

 25        }

 26        csHigh = dest.createCellStyle();
 27        csNormal = dest.createCellStyle();
 28ExpandedSubBlockStart.gifContractedSubBlock.gif        if (copyHighCell !=null){
 29            csHigh.cloneStyleFrom(copyHighCell.getCellStyle());
 30            copyHighCell = null;
 31        }

 32ExpandedSubBlockStart.gifContractedSubBlock.gif        if (copyNormalCell !=null){
 33            csNormal.cloneStyleFrom(copyNormalCell.getCellStyle());
 34            copyNormalCell = null;
 35        }

 36        
 37        
 38        
 39        //read over, toCopyColumns now has all column that need to copy
 40        Integer[] columns = new Integer[toCopyColumns.size()];
 41        toCopyColumns.toArray(columns);
 42        Arrays.sort(columns);
 43        
 44        Sheet destSheet = dest.createSheet("Sheet1");
 45ExpandedSubBlockStart.gifContractedSubBlock.gif        for (Row row:sheet){
 46            Row newRow = destSheet.createRow(row.getRowNum());
 47ExpandedSubBlockStart.gifContractedSubBlock.gif            for (int i = 0;i < columns.length;i++){
 48                Cell newCell = newRow.createCell(i);
 49                Cell oldCell = row.getCell(columns[i]);
 50ExpandedSubBlockStart.gifContractedSubBlock.gif                if (oldCell == null){
 51                    continue;
 52                }

 53ExpandedSubBlockStart.gifContractedSubBlock.gif                switch (oldCell.getCellType()){
 54                    case Cell.CELL_TYPE_FORMULA:
 55                        CellValue value = fe.evaluate(oldCell);
 56                        //judge the new cell format
 57                        newCell.setCellType(value.getCellType());
 58ExpandedSubBlockStart.gifContractedSubBlock.gif                        switch (value.getCellType()){
 59                            case Cell.CELL_TYPE_NUMERIC:
 60                                newCell.setCellValue(value.getNumberValue());break;
 61                            case Cell.CELL_TYPE_BOOLEAN:
 62                                newCell.setCellValue(value.getBooleanValue());break;
 63                            case Cell.CELL_TYPE_ERROR:
 64                                newCell.setCellErrorValue(value.getErrorValue());break;
 65                            case Cell.CELL_TYPE_STRING:
 66                                newCell.setCellValue(value.getStringValue());break;
 67                        }

 68                        break;
 69                    case Cell.CELL_TYPE_NUMERIC:
 70                        newCell.setCellValue(oldCell.getNumericCellValue());
 71                        newCell.setCellType(oldCell.getCellType());break;
 72                    case Cell.CELL_TYPE_BOOLEAN:
 73                        newCell.setCellValue(oldCell.getBooleanCellValue());
 74                        newCell.setCellType(oldCell.getCellType());break;
 75                    case Cell.CELL_TYPE_ERROR:
 76                        newCell.setCellErrorValue(oldCell.getErrorCellValue());
 77                        newCell.setCellType(oldCell.getCellType());break;
 78                    case Cell.CELL_TYPE_STRING:
 79                        newCell.setCellValue(oldCell.getStringCellValue());
 80                        newCell.setCellType(oldCell.getCellType());break;
 81                }

 82ExpandedSubBlockStart.gifContractedSubBlock.gif                if (oldCell.getCellStyle().getFillForegroundColor() == high){
 83                    newCell.setCellStyle(csHigh);
 84ExpandedSubBlockStart.gifContractedSubBlock.gif                }
else{
 85                    newCell.setCellStyle(csNormal);
 86                }

 87                
 88            }

 89        }

 90//        System.out.println(wb.getNumCellStyles());
 91//        System.out.println(dest.getNumCellStyles());
 92        return dest;
 93    }

 94    
 95ExpandedBlockStart.gifContractedBlock.gif    public static void main(String args[]) throws FileNotFoundException, IOException{
 96        
 97        HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream("test.xls"));
 98ExpandedSubBlockStart.gifContractedSubBlock.gif        HSSFWorkbook wb2 = convert (wb,new byte[]{(byte0xff,(byte0xff,0x0});
 99        wb2.write(new FileOutputStream("tt.xls"));
100    }

 

其中需要注意一点:对于一个Workbook而言,同样的单元格样式会存储在同一个样式属性中,由不同的单元格分别引用

所以一个个复制单元格的属性是不行滴,这样会造成目标文件样式数过大。

也没有什么好办法,因为源文件简单,所以就流氓了一下,哪位有更好的办法能压缩这个样式表,让重复的样式合并呢?

 

上个图

转载于:https://www.cnblogs.com/latifrons/archive/2009/07/04/1516963.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299885.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里大佬推荐初学者练习的 Java 开源项目

对于JAVA的新手来说&#xff0c;需要结合着相关书籍的学习和开源项目一起&#xff0c;才能达到比较好的效果。 在此推荐一些轻量级适合入门的JAVA开源项目&#xff0c;希望对题主的学习有所帮助。 项目名称&#xff1a;springboot-learning-example项目简介&#xff1a;sprin…

真·抬头发票!| 今日最佳

全世界只有3.14 %的人关注了青少年数学之旅&#xff08;图源迷惑行为大赏&#xff0c;侵权删&#xff09;

老歌新唱--使用VB6开发的ActiveX实现.NET程序的混淆加密

代码下载地址&#xff1a;http://files.cnblogs.com/wuhuacong/VBActiveX.rar 由于存在一下几种特点&#xff1a;1、.NET程序反编译容易&#xff0c;而使用一些混淆工具会导致有些程序不能运行2、VB6开发ActiveX控件&#xff0c;那叫一个快&#xff0c;VB代码也不是很容易被反编…

设计模式之适配器

适配器模式介绍介绍适配器模式的作用就是把原本不兼容的接口&#xff0c;通过适配修改到统一的过程&#xff0c;使得用户方便使用。在实际工作中&#xff0c; 有时候我们需要把各个业务线的各种类型服务做统一的包装&#xff0c;再对外提供接口进行使用。适配器模式要解决的主要…

qsort(bsearch,lsearch)—标准库排序,查找

2019独角兽企业重金招聘Python工程师标准>>> //对字符串排序 #include<iostream> #include<cstdlib> #include<string.h> #define N 8 using namespace std; int compare(const void *a,const void *b); int main(void) {int i;char s[8][10] {&q…

中科大博士写外挂被抓,非法牟利300多万!

全世界只有3.14 %的人关注了青少年数学之旅近日&#xff0c;扬州警方破获一起中科大博士伙同他人在网上销售外挂软件非法牟利超过 300 万的案件。2016年6月&#xff0c;北京某游戏公司发现网上有款名为“冰焰”的外挂软件大量销售&#xff0c;给他们的网游造成了巨大损失这款外…

C# WPF MVVM项目实战(进阶②)

这篇文章还是在之前用Caliburn.Micro搭建好的框架上继续做的开发&#xff0c;今天主要是增加了一个用户窗体ImageProcessView&#xff0c;然后通过Treeview切换选择项之后在界面显示不同效果的图片。01—重要的知识点本篇内容基于CM框架编写&#xff0c;涉及以下知识点&#xf…

浏览器要是能这么做就好了

原文地址&#xff1a;http://www.laaan.cn/?p994 之前和搜狗浏览器的开发团队做过一些合作。主要是用户教育方便的事。需要他们给我开几个接口&#xff0c;让flash与浏览器通讯。都是很谨慎的。不过后来想一想&#xff0c;要是搜狗浏览器能开放一些接口供js或flash调用该有多好…

腾讯架构师讲解Java接口的继承与抽象类

在实施接口中&#xff0c;我们利用interface语法&#xff0c;将interface从类定义中独立出来&#xff0c;构成一个主体。interface为类提供了接口规范。 在继承中&#xff0c;我们为了提高程序的可复用性&#xff0c;引入的继承机制。当时的继承是基于类的。interface接口同样可…

说说大型高并发高负载网站的系统架构

By Michael 转载请保留出处&#xff1a;俊麟 Michael’s blog (http://www.toplee.com/blog/?p71) Trackback Url : http://www.toplee.com/blog/wp-trackback.php?p71 我在CERNET做过拨号接入平台的搭建&#xff0c;而后在Yahoo&3721从事过搜索引擎前端开发&#xff0c;…

java基础之java输入输出语句

1、使用Scanner 使用时需要引入包importjava.util.Scanner;首先定义Scanner对象 Java基础学习&#xff1a;java输入输出语句 比如&#xff1a; Java基础学习&#xff1a;java输入输出语句 2、使用BufferedReader 用前需要引入importjava.io.Reader; Java基础学习&#xff1…

自制WiFiPineapple

什么是WiFiPineapple&#xff1f;关于这个问题&#xff0c;相信各位心里都有自己的答案&#xff0c;这里引用下radiowar的介绍&#xff1a;自从2008开始&#xff0c;WiFi PineApple成为了最受欢迎的安全测试设备&#xff0c;在开源无线安全审计软件社区的支持&#xff0c;WiFiP…

全世界的狗都没有“生殖隔离” | 今日趣图

全世界只有3.14 % 的人关注了青少年数学之旅动物界的“一拳超人”雀尾螳螂虾它有一双力大无比的铁拳出拳速度在五十分之一秒内最大速度可达80km/h产生约60kg的冲击力威力足以匹敌小口径手枪子弹&#xff08;图源冷知君&#xff0c;侵权删&#xff09;如何把清水一秒变可乐&…

聊聊Go的三色标记法

这里是Z哥的个人公众号每周五11&#xff1a;45 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「203」篇原创敬上大家好&#xff0c;我是 Z 哥。今天带来一篇久违的技术型文章。之前也有不少小伙伴会问&#xff0c;Z 哥你好久没发技术性文章了。其实主要原因有…

架构师讲解Java中websocket的应用

这篇文章主要来介绍一下在java项目中&#xff0c;特别是java web项目中websocket的应用。 场景&#xff1a;我做了一个商城系统&#xff0c;跟大多数商城系统&#xff0c;分为客户端和后台&#xff0c;客户端供客户浏览&#xff0c;下单&#xff0c;购买&#xff0c;后台主要管…

当你死后尸体如何处理?两种新玩法了解一下!

全世界只有3.14 %的人关注了青少年数学之旅据国外媒体报道&#xff0c;死亡是一个庄严肃穆的事情&#xff0c;但是依据不同的文化&#xff0c;人类死亡之后会被认为肉体与灵魂分离&#xff0c;采取的葬礼方式存在很大差异&#xff0c;你想过你的葬礼会是什么样吗&#xff1f;烟…

.NET Core开发实战(定义API的最佳实践)Source Generators版

前言极客时间上的《.NET Core开发实战》是一门非常好的课程&#xff0c;作者肖伟宇在第31课&#xff08;https://time.geekbang.org/course/detail/100044601-201165&#xff09;介绍了定义API的最佳实践。大意如下&#xff1a;Controller这一层负责与前端用户的交互&#xff0…

多年经验的程序员迷失了自己,该怎么办?

多年的程序员迷失了自己&#xff0c;该怎么办&#xff1f; 本文选自《我也能做CTO之程序员职业规划 》一书 我应该朝哪个方向发展&#xff1f;我不做这行还能做什么&#xff1f;当现实情况与理想目标之间的差距越拉越大时&#xff0c;大多数刚入行的IT人员都会提出这样的问题&a…

大神讲解Java for循环的几种用法

本文非常适合初学Java的程序员&#xff0c;主要是来了解一下Java中的几种for循环用法&#xff0c;分析得十分详细&#xff0c;一起来看看。 J2SE 1.5提供了另一种形式的for循环。借助这种形式的for循环&#xff0c;可以用更简单地方式来遍历数组和Collection等类型的对象。本文…

苍天饶过谁?| 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅&#xff08;图源人民日报&#xff0c;侵权删&#xff09;