1. 必要性 
Excel是一种常见的文档格式,通常情况下大多数的客户都对使用Excel十分的精通。对于我们来说,客户善于使用就可以使我们免于培训的烦恼。而某些系统往往需要录入相当量的数据,这些数据一般以某种特定的格式保存。而Excel正是一种相当规格的数据保存方式,至少它是易于格式化的,而且客户也能够按照某种特定的格式来将数据录入到Excel文件中去。所以综上,我们有必要了解如何用纯java来读取Excel文件。 
2. 目的 
我们希望用户将资料录入Excel的目的往往只有一个就是将这些数据导入到数据库中去。数据库往往比较复杂,而且各种不同的数据库产品之间是不同的,这种区别无疑的增加了我们导入的困难。从excel文件来说,用户录入的数据往往并不能直接使用,要经过逻辑处理或者出错的判断,或者默认的改正等。如果能够使用java来直接读取excel文件,无疑会使我们能够较从容的解决这些问题。 
3. 其他的方法 
将数据从excel文件中读出来还有一个方法,就是使用odbc。然后再用jdbc-odbc桥来将数据从excel文件中读出到java中来,不过这种方法必须配odbc,针对excle文件配odbc是一件很麻烦的事情,而且难以操控,所以这只能是一种暂时的解决方法。 
4. POI 
POI是Apache的Jakata项目,POI 代表 Poor Obfuscation Implementation,即不良模糊化实现。POI 的目标就是提供一组 Java API 来使得基于 Microsoft OLE 2 Compound Document 格式的 Microsoft Office 文件易于操作。一些 POI API 仅仅是为最常用的 Microsoft Office 文件 Word 和 Excel 而开发的;而其他的 API 则是用于通用的 OLE 2 Compound Document 和属性文件。POI可以到www.apache.org下载到。编译好的jar主要有这样4个:poi包,poi Browser包,poi hdf包,poi hssf例程包。实际运行时,需要有poi包就可以了。POI 是一个开放源代码项目,并且得到了数百名志愿者的不断更新。可以在 http://jakarta.apache.org/builds/jakarta-poi/ 上获得源代码和文档。通过POI包,我们不仅可以操纵excel文档,也能够操控word文档,以及其他的OLE2格式的文档。 
5. HSSF 
HSSF 代表 Horrible Spreadsheet Format(可怕的电子表格格式)。API 给程序员提供了极其容易地读写或操作 Microsoft Excel 97-2002 文件的能力。这些API都由POI包来提供,实际使用是我们只需要POI包就可以了。 
6. 操作EXCEL文件 
HSSF提供给用户使用的对象在org.apache.poi.hssf.usermodel包中,主要部分包括Excell对象,样式和格式,还有辅助操作。有以下几种对象:  
HSSFWorkbook excell的文档对象  
HSSFSheet excell的表单  
HSSFRow excell的行  
HSSFCell excell的格子单元  
HSSFFont excell字体  
HSSFName 名称  
HSSFDataFormat 日期格式  
在poi1.7中才有以下2项:  
HSSFHeader sheet头  
HSSFFooter sheet尾  
和这个样式  
HSSFCellStyle cell样式  
辅助操作包括  
HSSFDateUtil 日期  
HSSFPrintSetup 打印  
HSSFErrorConstants 错误信息表  
我们经常能够使用到的还是读取EXCEL文件,下面看一个例子: 
POIFSFileSystem fs  = new POIFSFileSystem(new FileInputStream("workbook.xls"));     HSSFWorkbook wb = new HSSFWorkbook(fs);     HSSFSheet sheet = wb.getSheetAt(0);     HSSFRow row = sheet.getRow(2);     HSSFCell cell = row.getCell((short)3); if (cell == null) {         cell = row.createCell((short)3); }     cell.setCellType(HSSFCell.CELL_TYPE_STRING);     cell.setCellValue("a test"); // Write the output to a file     FileOutputStream fileOut = new FileOutputStream("workbook.xls");     wb.write(fileOut); fileOut.close(); 
这是基本的读写方法,其中我们注意到HSSF中几个关键对象的使用。其中HSSFWorkbook代表的是整个文档,这个workbook的概念是excel本身的概念,如果你不清楚,就去查excel的帮助文档。HSSFSheet代表的是具体的表格,在excel中一份workbook中可能会有好几个表格,这些表格的顺序是从0开始的。“HSSFSheet sheet = wb.getSheetAt(0);”这一条语句就是建立表格对象即Sheet对象。Sheet对象建立之后就可以读Cell了,即表格的内容。 
通过POI来读取EXCEL文件就是这么简单。 
7. 一个例子 这个例子是基于GUI的,功能是读入一个excel文件并输出成html或者文本文件(需要你自己选择)。并能够生成insert语句。要使用POI包。 package testxls; 
import java.io.*; import javax.swing.*; import javax.swing.filechooser.FileFilter; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.poifs.filesystem.*; 
/**  * <p>Title: 取得xls电子表格内容</p>  * <p>Description: 这个类的作用是从微软的电子表格中读取信息,  *   目前支持Excel97,Excel2000。使用apache的poi包。</p>  * <p>Copyright: Copyright (c) 2003</p>  * <p>Company: </p>  * [email protected]  * @version 1.0  */ public class testxls {     File testfile = null;     private HSSFSheet sheet;     String Field = "";     String tbName=""; 
//--------------------------------------------------------     public testxls()     {     } 
//-------------------------------------------     public File filechooer()     { //文件选择器 
        JFileChooser chooser = new JFileChooser(); 
         XlsFileFiliter filter1 = new XlsFileFiliter(); 
        chooser.addChoosableFileFilter(filter1);         chooser.setAcceptAllFileFilterUsed(false);         int result = chooser.showOpenDialog(chooser);         testfile = chooser.getSelectedFile();         if (result == chooser.CANCEL_OPTION)             System.exit(0);         return testfile;     } 
//---------------------------------------------------     public HSSFSheet getSheet(File f)     { //得到一个sheet对象。 
        HSSFWorkbook wb = null;         POIFSFileSystem xlsf = null;         try         {             xlsf = new POIFSFileSystem(new FileInputStream(f));             wb = new HSSFWorkbook(xlsf);         }         catch (IOException ex)         {             System.err.println("错误:文件流输入有误。");             ex.printStackTrace();         }         HSSFSheet sheet = wb.getSheetAt(0);         return sheet;     } 
//-----------------------------------     public String[][] outresult()     {         int length[] = outresultlength();         String result[][] = new String[length[0]][length[1]]; 
        int lastrow = sheet.getLastRowNum()+1;         for (int i = 0; i < lastrow; i++)         {             HSSFRow row = sheet.getRow(i);             int lastcell = row.getLastCellNum();             for (int j = 0; j < lastcell; j++)             {                 HSSFCell cell = row.getCell( (short) j);                 if (cell == null)                     result[i][j] = "blank";                 else                 {                     switch (cell.getCellType())                     {                         case 1:                             result[i][j] = cell.getStringCellValue();                             break;                         case 0:                             result[i][j] = cell.getNumericCellValue() + "";                             break;                         case HSSFCell.CELL_TYPE_FORMULA:                              result[i][j] = cell.getCellFormula()+"";                              break;                         case 3:                             result[i][j] = "blank";                             break;                         default:                             result[i][j] = "blank";                             break;                     }                 }             }         }         for (int i = 0; i < result.length; i++)         {             for (int j = 0; j < result[i].length; j++)             {                 if (result[i][j] == null)                 {                     result[i][j] = "blank";                 }             }         }         return result;     } 
//--------------------------------------------------------------------------------     public int[] outresultlength()     { 
        int lastrow = sheet.getLastRowNum()+1;//它是从零开始计算的。         HSSFRow row = sheet.getRow(0);         int lastcell = row.getLastCellNum();         int a[] =             {             lastrow, lastcell};         return a;     } //----------------------------------------------------------------------     public void printRs(String[][] rs)     {         for (int i = 0; i < rs.length; i++)         {             for (int j = 0; j < rs[i].length; j++)             {                 System.out.print("(" + i + "," + j + ") " + rs[i][j] + " ");             }             System.out.println(" ");         }     } 
//-----------------------------------------------------------     public void outputXlsContent(String[][] xls)     {         String[][] content = xls; 
        JFileChooser chooser = new JFileChooser(); 
        int result = chooser.showSaveDialog(chooser);         File testfile1 = chooser.getSelectedFile();         if (result == chooser.CANCEL_OPTION)         {             System.exit(0);         }         try         {             DataOutputStream out = new DataOutputStream(new FileOutputStream(                 testfile1)); 
            String fileName = testfile.getName();             String sql1 = fileName + "\n <table border=\"1\"> ";             for (int i = 0; i < content.length; i++)             {                 sql1 = sql1 + " <tr> ";                 for (int j = 0; j < content[i].length; j++)                 {                     sql1 = sql1 + " <td> " + content[i][j] + " </td> ";                 }                 sql1 = sql1 + " </tr> ";             }             sql1 = sql1 + " </table> ";             byte[] b = sql1.getBytes("gbk");             out.write(b);             out.close();             javax.swing.JOptionPane.showMessageDialog(null, "文件已经保存,按确定键退出!",                 "结束!", javax.swing.JOptionPane.INFORMATION_MESSAGE);         }         catch (Exception ex)         {             ex.printStackTrace();         }     }   //-----------------------------------------------------------     public void outputXlsContent(String xls)     {       JFileChooser chooser = new JFileChooser(); 
       int result = chooser.showSaveDialog(chooser);        File testfile1 = chooser.getSelectedFile();        if (result == chooser.CANCEL_OPTION)        {            System.exit(0);        }       try       {         DataOutputStream out = new DataOutputStream(new FileOutputStream(             testfile1)); 
        String fileName = testfile.getName();         byte[] b = xls.getBytes("gbk");         out.write(b);         out.close();       }       catch (Exception ex)       {         ex.printStackTrace();       }     }   //----------------------------------------------------------- 
    public String generateinsertsql(String[][] content)     { 
      String fieldContent="";       int ilength=0; 
      String sql="";       for (int i = 1; i < content.length; i++)       {         fieldContent="'"+content[i][0]+"'";         for(int j=1;j<content[i].length;j++)         {           fieldContent=fieldContent+",'"+content[i][j]+"'";         }          sql=sql+"insert"+tbName+"("+Field+") values("+fieldContent+")\r\n";          ilength++;       }       System.out.print(sql);       System.out.println("lenth of i:"+ilength);       return sql; 
    } 
//-----------------------------------------------------------     public static void main(String[] args)     {         testxls testxls1 = new testxls();         testxls1.filechooer();         //testxls1.sheet= testxls1.getSheet(testxls1.filechooer());         //testxls1.generateinsertsql(testxls1.outresult());         //testxls1.outputXlsContent(testxls1.generateinsertsql(testxls1.outresult()));        // System.exit(0);     } } 
文件过滤器类: package testxls; 
/**  * <p>Title: </p>  * <p>Description: </p>  * <p>Copyright: Copyright (c) 2004</p>  * <p>Company: </p>  * @author ClarkHillm@hotmailcom  * @version 1.0  */ 
import java.io.*; import javax.swing.filechooser.FileFilter; 
public class XlsFileFiliter     extends javax.swing.filechooser.FileFilter {   public String getFilePostfix(String FileName)//截取文件后缀。   {     return FileName.substring(FileName.lastIndexOf(".")+1);   } //--------------------------------------------------   public String getDescription()   {       return "电子表格文档";   } 
//--------------------------------------------------   public boolean accept(File f)   {     String extension = "xls";     if (f.isDirectory())     {       return true;     }     String name = f.getName();     if (getFilePostfix(name).equals(extension))     {       return true;     }     else     {       return false;     }   } } 8. 结束 以上的对于POI的介绍只是很简单的引导大家入个门,如果大家感兴趣地话,可以自己参考POI的文档。
   
 
  |