关闭

Java读取MicrosoftOffice Excel的内容

标签: javaexceljar
880人阅读 评论(0) 收藏 举报
分类:

Java读取MicrosoftOffice Word的内容

  • 用到的jar包:
poi-3.9.jar,
stax2-api.jar,
xmlbeans-2.3.0.jar,:
poi-ooxml-3.9.jar,
poi-ooxml-schemas-3.9-20121203.jar,
dom4j-1.6.1.jar

下载地址:
http://download.csdn.net/detail/capmiachael/9535646
- 例1:

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.springframework.web.multipart.MultipartFile;


public class MicroOfficeFile {

    public Workbook readExcel(File file) {
        Workbook wb = null; //用Workbook是读取Excel2003、2007的通用方法。
        try {
//          InputStream ins = file.;
            wb = WorkbookFactory.create(file);
        } catch (IOException e) {
            System.out.println("获取文档数据流出错。");
            e.printStackTrace();
        } catch (InvalidFormatException e) {
            System.out.println("创建Excel文件出错。");
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            System.out.println("Your InputStream was neither an OLE2 stream, nor an OOXML stream");
            System.out.println("这不是一个Excel文件");
        }
        return wb;
    }

    public Workbook readExcel(MultipartFile multipartFile) {
//      multipartFile.getName();    //得到的是<input type="file">的name属性值。
//      System.out.println(multipartFile.getOriginalFilename() +" uploaded! "); //获取文件名
        Workbook wb = null; //用Workbook是读取Excel2003、2007的通用方法。
        try {
            InputStream ins = multipartFile.getInputStream();
            wb = WorkbookFactory.create(ins);
        } catch (IOException e) {
            System.out.println("获取文档数据流出错。");
            e.printStackTrace();
        } catch (InvalidFormatException e) {
            System.out.println("创建Excel文件出错。");
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            System.out.println("Your InputStream was neither an OLE2 stream, nor an OOXML stream");
            System.out.println("这不是一个Excel文件");
        }
        return wb;
    }

    /**
     * 取Excel所有数据,包含header
     * @return List<String[]>
     */
    public List<String[]> getAllData(Workbook wb, int sheetIndex) {
        List<String[]> dataList = new ArrayList<String[]>();
        int columnNum = 0;
        Sheet sheet = wb.getSheetAt(sheetIndex);
        if (sheet.getRow(0) != null) {
            columnNum = sheet.getRow(0).getLastCellNum() - sheet.getRow(0).getFirstCellNum();
        }
        if (columnNum > 0) {
            for (Row row : sheet) {
                String[] singleRow = new String[columnNum];
                int n = 0;
                for (int i = 0; i < columnNum; i++) {
                    Cell cell = row.getCell(i, Row.CREATE_NULL_AS_BLANK);
                    switch (cell.getCellType()) {
                    case Cell.CELL_TYPE_BLANK:
                        singleRow[n] = "";
                        break;
                    case Cell.CELL_TYPE_BOOLEAN:
                        singleRow[n] = Boolean.toString( cell.getBooleanCellValue() );
                        break;
                    // 数值
                    case Cell.CELL_TYPE_NUMERIC:
                        if (DateUtil.isCellDateFormatted(cell)) {   //判断是否是日期
                            Date date = cell.getDateCellValue();
                            singleRow[n] = DateTransform.Date2String(date, "yyyy-MM-dd HH:mm:ss");
                        } else {
                            cell.setCellType(Cell.CELL_TYPE_STRING);
                            String temp = cell.getStringCellValue();
                            // 判断是否包含小数点,如果不含小数点,则以字符串读取,如果含小数点,则转换为Double类型的字符串
                            if (temp.indexOf(".") > -1) {
                                singleRow[n] = String.valueOf( new Double(temp) ).trim();
                            } else {
                                singleRow[n] = temp.trim();
                            }
                        }
                        break;
                    case Cell.CELL_TYPE_STRING:
                        singleRow[n] = cell.getStringCellValue().trim();
                        break;
                    case Cell.CELL_TYPE_ERROR:
                        singleRow[n] = "";
                        break;
                    case Cell.CELL_TYPE_FORMULA:
                        cell.setCellType(Cell.CELL_TYPE_STRING);
                        singleRow[n] = cell.getStringCellValue();
                        if (singleRow[n] != null) {
                            singleRow[n] = singleRow[n].replaceAll("#N/A", "").trim();
                        }
                        break;
                    default:
                        singleRow[n] = "";
                        break;
                    }
                    n++;
                }
                if ("".equals(singleRow[0])) {
                    continue;
                }// 如果第一行为空,跳过
                dataList.add(singleRow);
            }
        }
        return dataList;
    }
}
public static void main(String [] args){
MicroOfficeFile mof = new MicroOfficeFile();
        String filepath = "E:\\001.xls";
        Workbook wb = mof.readExcel(filepath);
        List<String[]> list = mof.getAllData(wb, 0);
        return list;//不需要的不分可用sublist()截取,例如:return list.sublist(1, list.size()-3),第一行
                    //以及最后三行不要

    }

}

注意:
sheet.getLastRowNum()和getLastCellNum();
返回值经常与我们预期的不一致。
原因:
当单元格设置了格式后,填入值,又删除,但此时有些格式信息没有跟着删除,这时getLastRowNum返回的值就会大于我们预期的值。
只有单元格没设置格式时才能正确获取值,因此就需要我们去利用单元格内容判断,如:某一列或几列是否有数据。较为麻烦,但也是可行的。

  • 例2:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**
 * 读取Excel
 * 
 * @author Michael
 */
public class ReadBusExcelUtils {
//  private Logger logger = LoggerFactory.getLogger(ReadBusExcelUtils.class);
    private Workbook wb;
    private Sheet sheet;
    private Row row;

    public ReadBusExcelUtils(String filepath) {
        if (filepath == null) {
            return;
        }
        String ext = filepath.substring(filepath.lastIndexOf("."));
        try {
            InputStream is = new FileInputStream(filepath);
            if (".xls".equals(ext)) {
                wb = new HSSFWorkbook(is);
            } else if (".xlsx".equals(ext)) {
                wb = new XSSFWorkbook(is);
            } else {
                wb = null;
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
//          logger.error("FileNotFoundException", e);
        } catch (IOException e) {
            e.printStackTrace();
//          logger.error("IOException", e);
        }
    }

    /**
     * 读取Excel数据内容
     * 
     * @param InputStream
     * @return Map 包含单元格数据内容的Map对象
     * @author Michael
     */
    public ArrayList<ArrayList<Object>> readExcelContent() throws Exception {
        if (wb == null) {
            throw new Exception("Workbook对象为空!");
        }
        ArrayList<ArrayList<Object>> content = new ArrayList<ArrayList<Object>>();
        int sheetsNum = wb.getNumberOfSheets(); // 获取Sheet的个数
        for (int index = 0; index < sheetsNum; index++) {
            sheet = wb.getSheetAt(index);
            // 得到当前sheet总行数
            int rowNum = sheet.getLastRowNum();
            row = sheet.getRow(0);
            int colNum = row.getPhysicalNumberOfCells();
            for (int i = 5; i <= rowNum; i++) {
                row = sheet.getRow(i);
                int j = 0;
                ArrayList<Object> cellValue = new ArrayList<Object>();
                while (j < colNum) {
                    Object obj = null;

                    switch (j) {// 对第10,11,12列的数据进行取整操作
                    case 10:
                    case 11:
                    case 12:
                        obj = getCellFormatValue(row.getCell(j), 0);
                        break;
                    default:
                        obj = getCellFormatValue(row.getCell(j), 4);// 其他情况数字保留四位小数
                    }
                    cellValue.add(obj);
                    // System.out.println(j+"----"+cellValue);
                    j++;

                }
                if (cellValue.get(1) != "")
                    content.add(cellValue);
            }
            sheet = null;
        }
        return content;
    }

    /**
     * 根据Cell类型设置数据,如果是数字,小数点后保留DotNum位
     * 
     * @param cell
     * @param DotNum
     *            :需要保留的小数位数,若为0,取整。
     * @return
     */
    private Object getCellFormatValue(Cell cell, int DotNum) {
        Object cellvalue = "";
        if (cell != null) {
            // 判断当前Cell的Type
            switch (cell.getCellType()) {
            case Cell.CELL_TYPE_NUMERIC:// 如果当前Cell的Type为NUMERIC
            case Cell.CELL_TYPE_FORMULA: { // 判断当前的cell是否为Date
                if (DateUtil.isCellDateFormatted(cell)) {
                    Date date = cell.getDateCellValue();
                    DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 对日期进行格式化
                    cellvalue = df.format(date);
                } else {// 如果是纯数字

                    String Datatype = "#####0";
                    switch (DotNum) {
                    case 1:
                        Datatype = "#####0.#";
                        break;
                    case 2:
                        Datatype = "#####0.##";
                        break;
                    case 3:
                        Datatype = "#####0.###";
                        break;
                    case 4:
                        Datatype = "#####0.####";
                        break;
                    case 5:
                        Datatype = "#####0.#####";
                        break;
                    case 6:
                        Datatype = "#####0.######";
                        break;
                    default:
                        break;
                    }

                    DecimalFormat df = new DecimalFormat(Datatype);// 浮点数格式化对象---整数保留原样,小数最多保留到第四位
                    cellvalue = String.valueOf(df.format(
                            cell.getNumericCellValue()).toString());
                }
                break;
            }
            case Cell.CELL_TYPE_STRING:// 如果当前Cell的Type为STRING
                cellvalue = cell.getRichStringCellValue().getString().trim();// 取得当前的Cell字符串,删去字符串首尾的空格
                break;
            case Cell.CELL_TYPE_BOOLEAN:// 如果当前是Boolean型
                cellvalue = Boolean.toString(cell.getBooleanCellValue());
                break;
            default:// 默认的Cell值
                cellvalue = "";
            }
        } else {
            cellvalue = "";
        }
        return cellvalue;
    }

    public static void main(String[] args) {
        try {
            String filepath = "E:\\001.xls";
            ReadBusExcelUtils excelReader = new ReadBusExcelUtils(filepath);
            /**
             * 打印Excel表格内容
             */
            ArrayList<ArrayList<Object>> array = excelReader.readExcelContent();
            System.out.println("--------------------Excel表格的内容:--------------------");
            System.out.println("表格行数:"+array.size());
            System.out.println();
            System.out.println();
            for (int i = 0; i < array.size(); i++) {
                System.out.println(array.get(i));

            }

        } catch (FileNotFoundException e) {
            System.out.println("未找到指定路径的文件,请检查路径或文件名!");
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:146289次
    • 积分:1842
    • 等级:
    • 排名:千里之外
    • 原创:60篇
    • 转载:38篇
    • 译文:0篇
    • 评论:13条
    交流方式
    最新评论