工作时遇到这种情况:产品临时给一个表,表有六个sheet页,对应六个表,都是关于一些学生的信息啊,我们要用到这些数据,那么必须自己倒腾,把这些数据插到数据库,还好现在一些连接数据库的客户端便捷,我们可以直接导入excel,我用的Navicat Premium,将表导入成功,中间出了一些版本问题,貌似只能读取97-03 xls格式的Excel,总之注意文档的版本。因为给的表的字段名都是中文,一般咱们字段名用英文,所以就要改一下,最方便的估计就是写个工具将中文名字改成对应的首位字母拼起来的名字,如博客园变成bky。于是便有了如下代码:
package com.iflytek.excel; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import org.junit.Test; import net.sourceforge.pinyin4j.PinyinHelper; import jxl.Workbook; import jxl.read.biff.BiffException; import jxl.write.WritableCell; import jxl.write.WritableSheet; import jxl.write.WriteException; public class ReadExcel { @Test public void operate() throws BiffException, IOException { ReadExcel obj = new ReadExcel(); //创建Excel路径 File file = new File("C:"+ File.separator +"Users"+ File.separator +"Administrator"+ File.separator +"Desktop"+ File.separator +"学生报告样本数据@0421.xls"); obj.readExcel(file); } // 读Excel的方法readExcel,该方法的参数为一个File对象 public void readExcel(File file) throws BiffException, IOException { try { jxl.Workbook wb =null; //创建一个workbook对象 String excelpath = file.getAbsolutePath(); InputStream is = new FileInputStream(excelpath); //创建一个文件流,读入Excel文件 wb = Workbook.getWorkbook(is); //将文件流写入到workbook对象 //jxl.Workbook 对象是只读的,所以如果要修改Excel,需要创建一个可读的副本,副本指向原Excel文件 jxl.write.WritableWorkbook wbe= Workbook.createWorkbook(new File(excelpath), wb);//创建workbook的副本 int sheet_size=wbe.getNumberOfSheets(); for (int index = 0; index < sheet_size; index++) { // 每个页签创建一个Sheet对象 WritableSheet sheet = wbe.getSheet(index); //获取sheet // sheet.getColumns()返回该页的总列数 int column_total = sheet.getColumns(); for (int j = 0; j < column_total; j++) { String cellinfo = sheet.getCell(j, 0).getContents(); WritableCell cell =sheet.getWritableCell(j, 0); //获取第一行的所有单元格 jxl.format.CellFormat cf = cell.getCellFormat();//获取第一个单元格的格式 jxl.write.Label lbl = new jxl.write.Label(j, 0, getPinYinHeadChar(cellinfo));//修改後的值 lbl.setCellFormat(cf); //将修改后的单元格的格式设定成跟原来一样 sheet.addCell(lbl); //将改过的单元格保存到sheet } } wbe.write(); //将修改保存到workbook wbe.close(); //关闭workbook,释放内存 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (WriteException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // 返回中文的首字母 public static String getPinYinHeadChar(String str) { String convert = ""; for (int j = 0; j < str.length(); j++) { char word = str.charAt(j); String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word); if (pinyinArray != null) { convert += pinyinArray[0].charAt(0); } else { convert += word; } } System.out.println(convert); return convert; } }
第一次使用Jxl,通过它,Java可以很方便的操作微软的Excel文档。除了Jxl之外,还有Apache的一个POI项目,也可以操作Excel。