java-poi方式读取excel

来源:互联网 发布:java的socket如何部署 编辑:程序博客网 时间:2024/04/28 21:32
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);


           // 第一行为标题,不取


           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) {


                     // 注意:一定要设成这个,否则可能会出现乱码


                     cell.setEncoding(HSSFCell.ENCODING_UTF_16);


                     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);


    }


}


excel 2007以前的版本用HSSF对象读取,2007以后的用XSSF对象读取,只要把HSSF换成XSSF.















0 0