excel

 java 操作 Excel 最常用的就是JXL(java excel api)和POI,今先看下JXL吧。首先可以到http://www.andykhan.com/jexcelapi/download.html 下载最新的jxl.jar,里面有它的jar包和API,内有一个小例子,可以参考一下。

 

    JXL 用起来挺简单的,不过相应的其功能也并不是十分强大,对于一般的简单的excel操作还可以,对于太复杂的还是有些吃力,基本的操作也就是以下几项内容。

 

    首先,要创建一个可读写的工作簿(WritableWorkbook):

Java代码   收藏代码
  1. WritableWorkbook workbook = Workbook.createWorkbook(new File("d:\\test.xls"));  

 

    如果是想要修改一个已存在的excel工作簿,则需要先获得它的原始工作簿,再创建一个可读写的副本:

Java代码   收藏代码
  1. Workbook wb = Workbook.getWorkbook(new File("src\\test\\test.xls")); // 获得原始文档  
  2. WritableWorkbook workbook = Workbook.createWorkbook(new File("d:\\test_modified.xls"),wb); // 创建一个可读写的副本  

 

    然后,取得我们要操作的sheet,并对其进行相应的操作,如改名、合并单元格、设置列宽、行高等:

Java代码   收藏代码
  1. WritableSheet sheet = workbook.getSheet(0);  
  2. sheet.setName("修改后"); // 给sheet页改名  
  3. workbook.removeSheet(2); // 移除多余的标签页  
  4. workbook.removeSheet(3);  
  5.           
  6. sheet.mergeCells(0040); // 合并单元格  
  7. sheet.setRowView(0600); // 设置行的高度  
  8. sheet.setColumnView(030); // 设置列的宽度  
  9. sheet.setColumnView(120); // 设置列的宽度  

 

    之后,就是对单元格的操作了,可以通过如下方法获取一个单元格,其中两个参数分别为列、行的位置,从0开始计数,如(2,3)就代表单元格C4:

Java代码   收藏代码
  1. WritableCell cell = sheet.getWritableCell(2,3);  

 

    通过WritableFont、WritableCellFormat等对象可以设置单元格的字体、样式等外观:

Java代码   收藏代码
  1. WritableFont titleWf = new WritableFont(WritableFont.createFont("仿宋_GB2312"),// 字体  
  2.                             20,//WritableFont.DEFAULT_POINT_SIZE,   // 字号  
  3.                             WritableFont.NO_BOLD,                  // 粗体  
  4.                             false,                                 // 斜体  
  5.                             UnderlineStyle.NO_UNDERLINE,            // 下划线  
  6.                             Colour.BLUE2,                       // 字体颜色  
  7.                             ScriptStyle.NORMAL_SCRIPT);  
  8. WritableCellFormat wcf = new WritableCellFormat(titleWf);  
  9. wcf.setBackground(Colour.GRAY_25);// 设置单元格的背景颜色  
  10. wcf.setAlignment(Alignment.CENTRE); // 设置对齐方式  
  11. wcf.setBorder(Border.ALL, BorderLineStyle.THICK); // 添加边框  
  12. cell.setCellFormat(wcf);  

 

    在jxl中,有几种常用的数据类型,根据单元格内数据类型的不同,每个WritableCell可以根据其类型被转换为它的一个子类型,以便对不同类型的数据进行专门的处理,通常可以做这样的转换:

Java代码   收藏代码
  1. WritableCell fromCell = sheet0.getWritableCell(j, i);  
  2.   
  3. if (fromCell instanceof jxl.write.Number) {  
  4.     jxl.write.Number num = (jxl.write.Number) fromCell;  
  5. else if (fromCell instanceof jxl.write.Boolean) {  
  6.     jxl.write.Boolean bool = (jxl.write.Boolean) fromCell;  
  7. else if (fromCell instanceof jxl.write.DateTime) {  
  8.     jxl.write.DateTime dt = (jxl.write.DateTime) fromCell;  
  9. else if(fromCell instanceof Label){  
  10.     Label _label = (Label) fromCell;  
  11. }  
 

    当然,操作完成之后一定不要忘了刷新(或者叫写入?)和关掉工作簿:

Java代码   收藏代码
  1. workbook.write();  
  2. workbook.close();  
 

 

下面是参考jxl api里那个例子写的,把我自己觉得常用的excel操作基本都包含了:

Java代码   收藏代码
  1. package test;  
  2.   
  3. import java.io.File;  
  4. import java.io.IOException;  
  5. import java.net.MalformedURLException;  
  6. import java.net.URL;  
  7. import java.util.ArrayList;  
  8. import java.util.Calendar;  
  9. import java.util.Date;  
  10.   
  11. import jxl.CellType;  
  12. import jxl.Workbook;  
  13. import jxl.format.Alignment;  
  14. import jxl.format.Border;  
  15. import jxl.format.BorderLineStyle;  
  16. import jxl.format.Colour;  
  17. import jxl.format.ScriptStyle;  
  18. import jxl.format.UnderlineStyle;  
  19. import jxl.format.VerticalAlignment;  
  20. import jxl.read.biff.BiffException;  
  21. import jxl.write.Blank;  
  22. import jxl.write.DateFormat;  
  23. import jxl.write.DateFormats;  
  24. import jxl.write.DateTime;  
  25. import jxl.write.Formula;  
  26. import jxl.write.Label;  
  27. import jxl.write.Number;  
  28. import jxl.write.NumberFormat;  
  29. import jxl.write.WritableCell;  
  30. import jxl.write.WritableCellFeatures;  
  31. import jxl.write.WritableCellFormat;  
  32. import jxl.write.WritableFont;  
  33. import jxl.write.WritableHyperlink;  
  34. import jxl.write.WritableImage;  
  35. import jxl.write.WritableSheet;  
  36. import jxl.write.WritableWorkbook;  
  37. import jxl.write.WriteException;  
  38.   
  39. /** 
  40.  *  
  41.  * @author why 
  42.  * 
  43.  */  
  44. public class ExcelTest {  
  45.   
  46.     /** 
  47.      * @param args 
  48.      * @throws IOException  
  49.      * @throws BiffException  
  50.      * @throws WriteException  
  51.      */  
  52.     public static void main(String[] args) throws IOException, BiffException, WriteException {  
  53.         Workbook wb = Workbook.getWorkbook(new File("src\\test\\test.xls")); // 获得原始文档  
  54.         WritableWorkbook workbook = Workbook.createWorkbook(new File("d:\\test_modified.xls"),wb); // 创建一个可读写的副本  
  55.           
  56.           
  57.         /** 
  58.          * 定义与设置Sheet 
  59.          */  
  60.         WritableSheet sheet = workbook.getSheet(0);  
  61.         sheet.setName("修改后"); // 给sheet页改名  
  62.         workbook.removeSheet(2); // 移除多余的标签页  
  63.         workbook.removeSheet(3);  
  64.           
  65.         sheet.mergeCells(0040); // 合并单元格  
  66.         sheet.setRowView(0600); // 设置行的高度  
  67.         sheet.setColumnView(030); // 设置列的宽度  
  68.         sheet.setColumnView(120); // 设置列的宽度  
  69.           
  70.          WritableCell cell = null;  
  71.          WritableCellFormat wcf = null;  
  72.          Label label = null;  
  73.          WritableCellFeatures wcfeatures = null;  
  74.           
  75.          // 更改标题字体  
  76.          cell = sheet.getWritableCell(0,0);  
  77.          WritableFont titleWf = new WritableFont(WritableFont.createFont("仿宋_GB2312"),// 字体  
  78.                                                  20,//WritableFont.DEFAULT_POINT_SIZE,  // 字号  
  79.                                                  WritableFont.NO_BOLD,                  // 粗体  
  80.                                                  false,                                 // 斜体  
  81.                                                  UnderlineStyle.NO_UNDERLINE,           // 下划线  
  82.                                                  Colour.BLUE2,                          // 字体颜色  
  83.                                                  ScriptStyle.NORMAL_SCRIPT);  
  84.          wcf = new WritableCellFormat(titleWf);  
  85.          wcf.setBackground(Colour.GRAY_25);// 设置单元格的背景颜色  
  86.          wcf.setAlignment(Alignment.CENTRE); // 设置对齐方式  
  87.          wcf.setBorder(Border.ALL, BorderLineStyle.THICK); // 添加边框  
  88.          cell.setCellFormat(wcf);  
  89.           
  90.          // 将B3的字体改为仿宋_GB2312  
  91.          cell = sheet.getWritableCell(1,2);  
  92.          WritableFont fs = new WritableFont(WritableFont.createFont("仿宋_GB2312"),  
  93.                                            11);  
  94.          wcf = new WritableCellFormat(fs);  
  95.          cell.setCellFormat(wcf);  
  96.           
  97.          // 将B4的字号改为20  
  98.          cell = sheet.getWritableCell(1,3);  
  99.          WritableFont size20 = new WritableFont(WritableFont.createFont("宋体"),   
  100.                                                20);  
  101.          wcf = new WritableCellFormat(size20);  
  102.          cell.setCellFormat(wcf);  
  103.           
  104.          // 将B5的字体改为加粗  
  105.          cell = sheet.getWritableCell(1,4);  
  106.          WritableFont bold = new WritableFont(WritableFont.createFont("宋体"),   
  107.                                                11,  
  108.                                                WritableFont.BOLD);  
  109.          wcf = new WritableCellFormat(bold);  
  110.          cell.setCellFormat(wcf);  
  111.           
  112.          // 将B6的字体改为倾斜  
  113.          cell = sheet.getWritableCell(1,5);  
  114.          WritableFont italic = new WritableFont(WritableFont.createFont("宋体"),   
  115.                                                 11,  
  116.                                                 WritableFont.NO_BOLD,  
  117.                                                 true);  
  118.          wcf = new WritableCellFormat(italic);  
  119.          cell.setCellFormat(wcf);  
  120.           
  121.          // 将B7字体加下划线  
  122.          cell = sheet.getWritableCell(1,6);  
  123.          WritableFont underline = new WritableFont(WritableFont.createFont("宋体"),   
  124.                                                    11,  
  125.                                                    WritableFont.NO_BOLD,  
  126.                                                    false,  
  127.                                                    UnderlineStyle.SINGLE);  
  128.          wcf = new WritableCellFormat(underline);  
  129.          cell.setCellFormat(wcf);  
  130.           
  131.          // 将B8的文字改为“待修改文字-已修改”  
  132.          cell = sheet.getWritableCell(1,7);  
  133.          if (cell.getType() == CellType.LABEL)  
  134.          {  
  135.              Label lc = (Label) cell;  
  136.              lc.setString(lc.getString() + " - 已修改");  
  137.          }  
  138.           
  139.          // 将B9文字对齐方式改为垂直居中、右对齐  
  140.          cell = sheet.getWritableCell(1,8);  
  141.          WritableFont align = new WritableFont(WritableFont.createFont("宋体"),   
  142.                                                   11);  
  143.          wcf = new WritableCellFormat(align);  
  144.          wcf.setAlignment(Alignment.RIGHT); // 设置为右对齐  
  145.          wcf.setVerticalAlignment(VerticalAlignment.CENTRE); // 设置为垂直居中  
  146.          cell.setCellFormat(wcf);  
  147.           
  148.          // 将E3文字改为自动换行  
  149.          cell = sheet.getWritableCell(4,2);  
  150.          WritableFont justify = new WritableFont(WritableFont.createFont("宋体"),   
  151.                                                   11);  
  152.          wcf = new WritableCellFormat(justify);  
  153.          wcf.setAlignment(Alignment.JUSTIFY);  
  154.          cell.setCellFormat(wcf);  
  155.           
  156.           
  157.          // 将B12的数字有效位数从5位改为7位  
  158.          cell = sheet.getWritableCell(1,11);  
  159.          NumberFormat sevendps = new NumberFormat("#.0000000");  
  160.          wcf = new WritableCellFormat(sevendps);  
  161.          cell.setCellFormat(wcf);  
  162.           
  163.          // 将B13改为4位科学计数法表示  
  164.          cell = sheet.getWritableCell(1,12);  
  165.          NumberFormat exp4 = new NumberFormat("0.####E0");  
  166.          wcf = new WritableCellFormat(exp4);  
  167.          cell.setCellFormat(wcf);  
  168.           
  169.          // 将B14改为默认数字表示  
  170.          cell = sheet.getWritableCell(1,13);  
  171.          cell.setCellFormat(WritableWorkbook.NORMAL_STYLE);  
  172.           
  173.          // 将B15数字类型的值17改为22  
  174.          cell = sheet.getWritableCell(1,14);  
  175.          if (cell.getType() == CellType.NUMBER)  
  176.          {  
  177.              Number n = (Number) cell;  
  178.              n.setValue(42);  
  179.          }  
  180.           
  181.          // 将B16的值2.71进行加法运算2.71 + 0.1  
  182.          cell = sheet.getWritableCell(1,15);  
  183.          if (cell.getType() == CellType.NUMBER)  
  184.          {  
  185.              Number n = (Number) cell;  
  186.              n.setValue(n.getValue() + 0.1);  
  187.          }  
  188.           
  189.          // 将B19日期格式改为默认  
  190.          cell = sheet.getWritableCell(1,18);  
  191.          wcf = new WritableCellFormat(DateFormats.FORMAT9);  
  192.          cell.setCellFormat(wcf);  
  193.           
  194.          // 将B20日期格式改为dd MMM yyyy HH:mm:ss  
  195.          cell = sheet.getWritableCell(1,19);  
  196.          DateFormat df = new DateFormat("dd MMM yyyy HH:mm:ss");  
  197.          wcf = new WritableCellFormat(df);  
  198.          cell.setCellFormat(wcf);  
  199.           
  200.          // 将B21的日期设置为 2011-6-1 11:18:50  
  201.          cell = sheet.getWritableCell(1,20);  
  202.          if (cell.getType() == CellType.DATE)  
  203.          {  
  204.              DateTime dt = (DateTime) cell;  
  205.              Calendar cal = Calendar.getInstance();  
  206.              cal.set(201151111850);  
  207.              Date d = cal.getTime();  
  208.              dt.setDate(d);  
  209.          }  
  210.           
  211.           
  212.          // 将B24文字添加链接http://www.baidu.com  
  213.          WritableHyperlink link = new WritableHyperlink(123new URL("http://www.baidu.com"));  
  214.          sheet.addHyperlink(link);  
  215.           
  216.          // 更改URL链接  
  217.          WritableHyperlink hyperlinks[] = sheet.getWritableHyperlinks();  
  218.          for (int i = 0; i < hyperlinks.length; i++) {  
  219.              WritableHyperlink wh = hyperlinks[i];  
  220.              if (wh.getColumn() == 1 && wh.getRow() == 24) {  
  221.                  // 将B25文字链接取消  
  222.                  sheet.removeHyperlink(wh,true);//true:保留文字;false:删除文字  
  223.              }else if(wh.getColumn() == 1 && wh.getRow() == 25){  
  224.                  try {  
  225.                      // 将B26链接更改为http://wuhongyu.javaeye.com  
  226.                      wh.setURL(new URL("http://wuhongyu.javaeye.com"));  
  227.                  } catch (MalformedURLException e) {  
  228.                      e.printStackTrace();  
  229.                  }  
  230.              }  
  231.          }  
  232.           
  233.           
  234.          // 利用公式取得B29、B30的值  
  235.          Formula f1 = new Formula(128"SUM(C29:D29)");  
  236.          sheet.addCell(f1);  
  237.          Formula f2 = new Formula(129"AVERAGE(C30:G30)");  
  238.          sheet.addCell(f2);  
  239.           
  240.          // 在B32处添加图片,图片大小占10行3列,只支持png格式  
  241.          File file = new File("d:\\shu05.png");  
  242.          WritableImage image = new WritableImage(131310, file);  
  243.          sheet.addImage(image);  
  244.           
  245.          // 在A44出添加内容"Added drop down validation",并为其添加注释  
  246.          label = new Label(043"Added drop down validation");  
  247.          wcfeatures = new WritableCellFeatures();  
  248.          wcfeatures.setComment("右边列是个下拉列表");  
  249.          label.setCellFeatures(wcfeatures);  
  250.          sheet.addCell(label);  
  251.            
  252.          // 在B44处添加一个下拉列表并添加注释  
  253.          Blank b = new Blank(143);  
  254.          wcfeatures = new WritableCellFeatures();  
  255.          ArrayList al = new ArrayList();  
  256.          al.add("why");  
  257.          al.add("landor");  
  258.          al.add("tjm");  
  259.          wcfeatures.setDataValidationList(al);  
  260.          wcfeatures.setComment("这是一个注释");  
  261.          b.setCellFeatures(wcfeatures);  
  262.          sheet.addCell(b);  
  263.            
  264.          // 为A46添加注释。  
  265.          // 此处比较麻烦,试了多次发现必须将cell强制类型转换、添加CellFeatures再修改注释才可用,不知有没有更好的办法。  
  266.          cell = sheet.getWritableCell(0,45);  
  267.          wcfeatures = new WritableCellFeatures();  
  268.          wcfeatures.setComment("这个注释不会被显示,删了这行还不行,MD");  
  269.          cell.setCellFeatures(wcfeatures);  
  270.            
  271.          label = (Label) cell;  
  272. //       label.setCellFeatures(wcfeatures);// 直接这样写会报一个警告(“注释已存在”),但那个注释仍会被显示。  
  273.          label.addCellFeatures();  
  274.          label.getWritableCellFeatures().setComment("终于加上注释了,哈哈哈哈");  
  275.            
  276.            
  277. //      if (cell instanceof Number) {  
  278. //          Number num = (Number) cell;  
  279. //          num.setCellFeatures(wcfeatures);  
  280. //      } else if (cell instanceof jxl.write.Boolean) {  
  281. //          jxl.write.Boolean bool = (jxl.write.Boolean) cell;  
  282. //          bool.setCellFeatures(wcfeatures);  
  283. //      } else if (cell instanceof jxl.write.DateTime) {  
  284. //          jxl.write.DateTime dt = (jxl.write.DateTime) cell;  
  285. //          dt.setCellFeatures(wcfeatures);  
  286. //      } else {  
  287. //          Label _label = (Label) cell;  
  288. //          _label.setCellFeatures(wcfeatures);  
  289. //      }  
  290.            
  291.          workbook.write();  
  292.          workbook.close();  
  293.          wb.close();  
  294.     }  
  295.   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值