ZGY的Excel特征提取器初期版本完成
生活随笔
收集整理的這篇文章主要介紹了
ZGY的Excel特征提取器初期版本完成
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
其實這個初期版本已經基本上把他要的功能都實現了,呵呵
他的要求是批量轉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特征提取器初期版本完成的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 壁挂炉洗澡怎么调水温_松鼠洗澡水温-小松
- 下一篇: 病毒的认识