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

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

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

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

  1public 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
 14        for (Row row:sheet){
 15            for (Cell cell :row){
 16                //find high lighted cell
 17                if (cell.getCellStyle().getFillForegroundColor() == high){
 18                    //hit
 19                    toCopyColumns.add(cell.getColumnIndex());
 20                    copyHighCell = cell;
 21                }else{
 22                    copyNormalCell = cell;
 23                }
 24            }
 25        }
 26        csHigh = dest.createCellStyle();
 27        csNormal = dest.createCellStyle();
 28        if (copyHighCell !=null){
 29            csHigh.cloneStyleFrom(copyHighCell.getCellStyle());
 30            copyHighCell = null;
 31        }
 32        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");
 45        for (Row row:sheet){
 46            Row newRow = destSheet.createRow(row.getRowNum());
 47            for (int i = 0;i < columns.length;i++){
 48                Cell newCell = newRow.createCell(i);
 49                Cell oldCell = row.getCell(columns[i]);
 50                if (oldCell == null){
 51                    continue;
 52                }
 53                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());
 58                        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                }
 82                if (oldCell.getCellStyle().getFillForegroundColor() == high){
 83                    newCell.setCellStyle(csHigh);
 84                }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    
 95    public static void main(String args[]) throws FileNotFoundException, IOException{
 96        
 97        HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream("test.xls"));
 98        HSSFWorkbook wb2 = convert (wb,new byte[]{(byte) 0xff,(byte) 0xff,0x0});
 99        wb2.write(new FileOutputStream("tt.xls"));
100    }

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

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

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

上个图

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

ZGY的Excel特征提取器初期版本完成相关推荐

  1. excel切片器_听说你还不会用切片器?比筛选好用100倍,小白也能学会

    私信回复关键词[2020]~ 获取100+套高颜值图表模板! 大家好,我是还在写毕业论文的小E~ 临近毕业,还要搞 PPT!心累啊! 这不,我在看关于怎么做毕业论文 PPT 的时候,无意中看到了这样的 ...

  2. excel切片器显示错误_带切片器的Excel弹出选择器工具

    excel切片器显示错误 Slicers make it easy to select from a list of items, but they take up valuable space on ...

  3. ppt复制切片器_手把手教你使用Excel切片器,小白也能做出好看又好玩的动态图表...

    私信回复关键词[2020]~ 获取100+套高颜值图表模板! 大家好,我是还在写毕业论文的小E~ 临近毕业,还要搞 PPT!心累啊! 这不,我在看关于怎么做毕业论文 PPT 的时候,无意中看到了这样的 ...

  4. 【深度学习】特征提取器:Transformer,Rnn,CNN之间的相互比较

    在辞旧迎新的时刻,大家都在忙着回顾过去一年的成绩(或者在灶台前含泪数锅),并对2019做着规划,当然也有不少朋友执行力和工作效率比较高,直接把2018年初制定的计划拷贝一下,就能在3秒钟内完成2019 ...

  5. Transformer、rnn与cnn三大特征提取器的比较

    自然语言处理中的三大特征处理器:RNN.CNN.Transformer,它们目前谁各方面占据优势?未来谁又更有前途呢?这篇文章用目前的各种实验数据给出了说明,结论是:放弃幻想,全面拥抱Transfor ...

  6. excel筛选器多选_神秘的Excel 2013筛选器问题

    excel筛选器多选 A couple of days ago, I had problems while trying to run a simple macro in Excel 2013. Th ...

  7. 自动化特征提取器:图像特征提取和深度学习

    自动化特征提取器:图像特征提取和深度学习 转载:github 译者:@friedhelm739 视觉和声音是人类固有的感觉输入.我们的大脑是可以迅速进化我们的能力来处理视觉和听觉信号的,一些系统甚至在 ...

  8. 特征工程系列之自动化特征提取器

    视觉和声音是人类固有的感觉输入.我们的大脑是可以迅速进化我们的能力来处理视觉和听觉信号的,一些系统甚至在出生前就对刺激做出反应.另一方面,语言技能是学习得来的.他们需要几个月或几年的时间来掌握.许多人 ...

  9. 面向机器学习的特征工程 八、自动化特征提取器:图像特征提取和深度学习

    来源:ApacheCN<面向机器学习的特征工程>翻译项目 译者:friedhelm739 校对:(虚位以待) 视觉和声音是人类固有的感觉输入.我们的大脑是可以迅速进化我们的能力来处理视觉和 ...

最新文章

  1. 练习2:课工场响应式导航条_作业帮直播课APP下载最新版入口
  2. c++ Lambda
  3. PHP:第一章——PHP中的魔术常量
  4. BZOJ3231(矩阵连乘,稍有点复杂)
  5. 小学二年几手工计算机的制作,小学二年级创意手工制作方法
  6. python网络编程基础知识_python网络编程基础
  7. 如何将Mac外部驱动器映射到CrossOver容器
  8. androidnbsp;框架构图
  9. 一道阿姆斯特朗回旋好题( Convex HDU - 5979)
  10. openstack 单节点 ubuntu 12.04 server 安装步骤 转自陈沙克老师博客
  11. 基于Redis GEO(地理位置) 实现附近的人,商家等相关功能实现 使用SpringBoot Redis工具类
  12. Python爬取股票数据存入mysql数据库,获取股票(最新、最高、今开、成交量、成交额、量比、换手率、涨幅等)支持多线程+数据库连接池
  13. 基于数据挖掘的H公园客流量分析预测
  14. uniapp获取当前位置(定位-经纬度及城市信息)
  15. 达梦数据库配置SSL认证加密
  16. AutoCAD Civil 3D-超高及数据编辑输入
  17. linux系统测试屏幕,RedHat Linux 9.0 操作系统测试题2
  18. 深度学习中,CPU、GPU、NPU、FPGA如何发挥优势?
  19. 豆瓣八卦小组html失败,养活无数营销号的豆瓣小组,到底在聊什么?
  20. Fail2ban 删除策略 使用firewalld

热门文章

  1. 硬件基础:虚拟内存相关知识介绍?
  2. C#通过SMTP发送邮件代码示例
  3. 华为手机相册怎么镜像翻转_怎么利用手机相册制作电子视频
  4. asp js单步调试_如何使用Chrome的控制台高效的调试Javascript代码?
  5. system函数和popen函数使用方法
  6. java定时线程池_java 定时器线程池(ScheduledThreadPoolExecutor)的实现
  7. 文本字段和表单设计-UI组件系列
  8. 张旭升20162329 2006-2007-2 《Java程序设计》第一周学习总结
  9. Firefox about
  10. 使用ndk standalone工具链来编译某个平台下的库