Java修改Excel单元格的数据及格式

  转自aking21alinjuju:《Java开发有一说一》——Java修改Excel单元格的数据及格式

继前两节的Java读取、写入Excel后,本期将推出Java修改Excel中数据以及格式的方法和技巧,如果大家学习了前面的读、写Excel,相信学习本节内容将是不费吹灰之力啊,不过要灵活的运用还需多加努力呀。

      好了,为了展示Java修改Excel的魅力,我们先来设计一个业务场景,这个场景是根据最近做过的一件事设计出来的:

      在一张Excel中,有一批学生信息数据如下图:

 

 图1   Excel中的示例数据

      在创建Excel时,将Excel中的所在省,所在市做成了下拉菜单以供选择,设置如下:

                            

                   图2    所在省一览                               图3     所在市一览

      从图1我们会发现一个问题,王五的填写所在省为:四川省,而所在市为:石家庄,大家都石家庄是河北的省会,所以王五的这种情况属于Excel中的错误数据,那么下面我们来做一件事:将Excel中所有出现省市关系弄错了的,在Excel中进行标注出来!!

代码如下:

[java]  view plain copy
  1. package jxl.zhanhj;  
  2.   
  3. import java.io.*;  
  4. import java.util.HashMap;  
  5.   
  6. import jxl.*;  
  7. import jxl.format.Alignment;  
  8. import jxl.format.Border;  
  9. import jxl.format.BorderLineStyle;  
  10. import jxl.format.Colour;  
  11. import jxl.format.VerticalAlignment;  
  12. import jxl.write.Label;  
  13. import jxl.write.WritableCellFormat;  
  14. import jxl.write.WritableFont;  
  15. import jxl.write.WritableSheet;  
  16. import jxl.write.WritableWorkbook;  
  17. import jxl.write.WriteException;  
  18.   
  19. public class UpdateExcel {  
  20.     public static void main(String args[]) {  
  21.         WritableWorkbook book = null;  
  22.         HashMap<String, String> map = new HashMap<String, String>();  
  23.         map = getPCKV();  
  24.         try {  
  25.             // Excel获得文件  
  26.             Workbook wb = Workbook.getWorkbook(new File("update_test.xls"));  
  27.             // 打开一个文件的副本,并且指定数据写回到原文件  
  28.             book = Workbook.createWorkbook(new File("update_test.xls"), wb);  
  29.             Sheet sheet = book.getSheet(0);  
  30.             WritableSheet wsheet = book.getSheet(0);  
  31.             int colunms = sheet.getColumns();  
  32.             // 不读表头  
  33.             for (int i = 1; i < sheet.getRows(); i++) {  
  34.                 StringBuffer pcin = new StringBuffer();  
  35.                 // 将省市组合起来与HashMap进行匹配  
  36.                 String province = sheet.getCell(4, i).getContents().trim();  
  37.                 String city = sheet.getCell(5, i).getContents().trim();  
  38.                 pcin = pcin.append(province).append("-").append(city);  
  39.                 // 如果不匹配,则在该行的最后加入标注信息  
  40.                 if (!map.containsValue(pcin.toString())) {  
  41.                     Label label = new Label(colunms, i, "省市选择出错",  
  42.                             getDataCellFormat());  
  43.                     wsheet.addCell(label);  
  44.                 }  
  45.             }  
  46.             book.write();  
  47.         } catch (Exception e) {  
  48.             System.out.println(e);  
  49.         } finally {  
  50.             try {  
  51.                 book.close();  
  52.             } catch (IOException e) {  
  53.                 e.printStackTrace();  
  54.             }  
  55.         }  
  56.     }  
  57.   
  58.     // 设置标注的格式为黄底红字  
  59.     public static WritableCellFormat getDataCellFormat() {  
  60.         WritableCellFormat wcf = null;  
  61.         try {  
  62.             WritableFont wf = new WritableFont(WritableFont.TIMES, 10,  
  63.                     WritableFont.BOLD, false);  
  64.             // 字体颜色  
  65.             wf.setColour(Colour.RED);  
  66.             wcf = new WritableCellFormat(wf);  
  67.             // 对齐方式  
  68.             wcf.setAlignment(Alignment.CENTRE);  
  69.             wcf.setVerticalAlignment(VerticalAlignment.CENTRE);  
  70.             // 设置上边框  
  71.             wcf.setBorder(Border.TOP, BorderLineStyle.THIN);  
  72.             // 设置下边框  
  73.             wcf.setBorder(Border.BOTTOM, BorderLineStyle.THIN);  
  74.             // 设置左边框  
  75.             wcf.setBorder(Border.LEFT, BorderLineStyle.THIN);  
  76.             // 设置右边框  
  77.             wcf.setBorder(Border.RIGHT, BorderLineStyle.THIN);  
  78.             // 设置背景色  
  79.             wcf.setBackground(Colour.YELLOW);  
  80.             // 自动换行  
  81.             wcf.setWrap(true);  
  82.         } catch (WriteException e) {  
  83.             e.printStackTrace();  
  84.         }  
  85.         return wcf;  
  86.     }  
  87.   
  88.     // 省市对应关系Map  
  89.     public static HashMap<String, String> getPCKV() {  
  90.         HashMap<String, String> map = new HashMap<String, String>();  
  91.         map.put("01""河北省-石家庄");  
  92.         map.put("02""河北省-秦皇岛");  
  93.         map.put("03""河北省-唐山");  
  94.         map.put("04""四川省-成都");  
  95.         map.put("05""四川省-绵阳");  
  96.         map.put("06""四川省-达州");  
  97.         map.put("07""广西省-桂林");  
  98.         map.put("08""广西省-南宁");  
  99.         map.put("09""广西省-柳州");  
  100.         return map;  
  101.     }  
  102. }  

 

代码执行结果如图所示:

图4      执行结果

     

      到这里,Java修改Excel单元格的数据及格式便告一段落了,本节给出了一个较为简单的场景进行了讲述,目的在于引导大家学习Java修改Excel的常用流程和方法,若读者能将Java操作Excel学得更深,往往可以发挥更大的作用。比如程序中利用HashMap来存储对应关系,如果要将全国的省市纳入进来,利用HashMap不是很好的做好,我们可以改成通过利用数据库来达到同样的效果,这里的改进留给读者。

     

      读到这里,可能有部分读者会产生疑问,这种操作,直接在Excel中,我们不是也可以操作吗?为什么通过Java来修改,是不是多此一举了?其实不然,如果读者将Java读写文件结合起来,以及在将此程序稍微扩展一下,对每个Excel的所有页签进行遍历,那么Java程序处理的数据里和复杂度,远远不是单纯的Excel能企及的。举个简单的场景(仅仅将上述场景进行扩展):

      如果一个学院要统计该学院所有学生的信息【格式和图1一样】,每个级发一个Excel,每个级不同专业的学生放在不同的页签中(sheet),如Excel样式下图所示:

图5      09级学生信息统计表

 

图6      10级学生信息统计表

 

      最终,学院要根据收集上来的学生信息导入到数据库中,如果你是那个负责导入数据的人,你便通过Java读写Excel功能将所有的数据转化成SQL语句,同时可以判断出哪些同学信息填写错误,是不是这种应用变得更有意义了?

      其实学习程序往往就是这样,掌握了各个知识点后要懂得把学过的只是串联起来,连点成线,这样在能更好的解决问题,希望本节的内容对大家有帮助,下期再见!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值