用poi实现excel的读写

12年前

Microsoft的Office系列产品拥有大量的用户,Word、Excel也成为办公文件的首选。在Java中,已经有很多对于Word、Excel的开源的解决方案,其中比较出色的是Apache的Jakata项目的POI子项目。该项目的官方网站是http://jakarta.apache.org/poi/。
POI包括一系列的API,它们可以操作基于MicroSoft OLE 2 Compound Document Format的各种格式文件,可以通过这些API在Java中读写Excel、Word等文件。POI是完全的Java Excel和Java Word解决方案。POI子项目包括:POIFS、HSSF、HDF、HPSF。

刚刚碰到excel的读写问题,还不熟悉阿帕奇的POI,在找写例子,先记下api的地址:http://poi.apache.org/apidocs/index.html

import java.io.BufferedInputStream;  import java.io.File;  import java.io.FileInputStream;  import java.io.FileNotFoundException;  import java.io.IOException;  import java.text.DecimalFormat;  import java.text.SimpleDateFormat;  import java.util.ArrayList;  import java.util.Arrays;  import java.util.Date;  import java.util.List;    import org.apache.poi.hssf.usermodel.HSSFCell;  import org.apache.poi.hssf.usermodel.HSSFDateUtil;  import org.apache.poi.hssf.usermodel.HSSFRow;  import org.apache.poi.hssf.usermodel.HSSFSheet;  import org.apache.poi.hssf.usermodel.HSSFWorkbook;  import org.apache.poi.poifs.filesystem.POIFSFileSystem;    public class ExcelOperate {      public static void main(String[] args) throws Exception {           File file = new File("ExcelDemo.xls");           String[][] result = getData(file, 1);           int rowLength = result.length;           for(int i=0;i<rowLength;i++) {               for(int j=0;j<result[i].length;j++) {                  System.out.print(result[i][j]+"\t\t");               }               System.out.println();         }                   }        /**         * 读取Excel的内容,第一维数组存储的是一行中格列的值,二维数组存储的是多少个行         * @param file 读取数据的源Excel         * @param ignoreRows 读取数据忽略的行数,比喻行头不需要读入 忽略的行数为1         * @return 读出的Excel中数据的内容         * @throws FileNotFoundException         * @throws IOException         */        public static String[][] getData(File file, int ignoreRows)               throws FileNotFoundException, IOException {                 List<String[]> result = new ArrayList<String[]>();           int rowSize = 0;         //建立输入流         BufferedInputStream in = new BufferedInputStream(new FileInputStream(                  file));           // 打开HSSFWorkbook         POIFSFileSystem fs = new POIFSFileSystem(in);         HSSFWorkbook wb = new HSSFWorkbook(fs);         HSSFCell cell = null;           //开始读取数据         for (int sheetIndex = 0; sheetIndex < wb.getNumberOfSheets(); sheetIndex++) {               HSSFSheet st = wb.getSheetAt(sheetIndex);             System.out.println(st);             // 第一行为标题,不取                          for (int rowIndex = ignoreRows; rowIndex <= st.getLastRowNum(); rowIndex++) {                  HSSFRow row = st.getRow(rowIndex);                  if (row == null) {                      continue;                  }                  int tempRowSize = row.getLastCellNum() + 1;                  if (tempRowSize > rowSize) {                      rowSize = tempRowSize;                  }                  String[] values = new String[rowSize];                  Arrays.fill(values, "");                  boolean hasValue = false;                  for (short columnIndex = 0; columnIndex <= row.getLastCellNum(); columnIndex++) {                      String value = "";                      cell = row.getCell(columnIndex);                      if (cell != null) {                                           switch (cell.getCellType()) {                         case HSSFCell.CELL_TYPE_STRING:                             value = cell.getStringCellValue();                             break;                         case HSSFCell.CELL_TYPE_NUMERIC:                             if (HSSFDateUtil.isCellDateFormatted(cell)) {                                Date date = cell.getDateCellValue();                                if (date != null) {                                    value = new SimpleDateFormat("yyyy-MM-dd")                                           .format(date);                                } else {                                    value = "";                                }                             } else {                                value = new DecimalFormat("0").format(cell                                       .getNumericCellValue());                             }                             break;                         case HSSFCell.CELL_TYPE_FORMULA:                             // 导入时如果为公式生成的数据则无值                             if (!cell.getStringCellValue().equals("")) {                                value = cell.getStringCellValue();                             } else {                                value = cell.getNumericCellValue() + "";                             }                             break;                         case HSSFCell.CELL_TYPE_BLANK:                             break;                         case HSSFCell.CELL_TYPE_ERROR:                             value = "";                             break;                         case HSSFCell.CELL_TYPE_BOOLEAN:                             value = (cell.getBooleanCellValue() == true ? "Y"                                    : "N");                             break;                         default:                             value = "";                         }                      }                      if (columnIndex == 0 && value.trim().equals("")) {                         break;                      }                      values[columnIndex] = rightTrim(value);                      hasValue = true;                  }                       if (hasValue) {                      result.add(values);                  }               }           }           in.close();           String[][] returnArray = new String[result.size()][rowSize];           for (int i = 0; i < returnArray.length; i++) {               returnArray[i] = (String[]) result.get(i);           }           return returnArray;        }                /**         * 去掉字符串右边的空格         * @param str 要处理的字符串         * @return 处理后的字符串         */         public static String rightTrim(String str) {           if (str == null) {               return "";           }           int length = str.length();           for (int i = length - 1; i >= 0; i--) {               if (str.charAt(i) != 0x20) {                  break;               }               length--;           }           return str.substring(0, length);        }    }