zoukankan      html  css  js  c++  java
  • poi excel

    package com.hd.oper;
     
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.PushbackInputStream;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import org.apache.poi.POIXMLDocument;
    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFCellStyle;
    import org.apache.poi.hssf.usermodel.HSSFFont;
    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.openxml4j.exceptions.InvalidFormatException;
    import org.apache.poi.poifs.filesystem.POIFSFileSystem;
    import org.apache.poi.ss.usermodel.Cell;
    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.apache.poi.xssf.usermodel.XSSFCell;
    import org.apache.poi.xssf.usermodel.XSSFCellStyle;
    import org.apache.poi.xssf.usermodel.XSSFFont;
    import org.apache.poi.xssf.usermodel.XSSFRow;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
     
    public class Exceloper {
    public static void main(String[] args) {
    String path2003 = "d:\Desktop\夏.xls ";// Excel2003文件路径
    String path2007 = "d:\Desktop\夏.xls ";// Excel2007文件路径
    path2003 = System.getProperties().getProperty("user.dir")
    + File.separator + "Excel" + File.separator + "user_2003.xls";
    path2007 = System.getProperties().getProperty("user.dir")
    + File.separator + "Excel" + File.separator + "user_2007.xlsx";
     
    long start2003 = System.currentTimeMillis();
    System.out.println("Excel文件路径:" + path2003);
    List<User> list2003 = parseExcel(path2003);
    System.out.println("解析2003输出总人数:" + list2003.size());
    long end2003 = System.currentTimeMillis();
    System.out.println("解析Excel2003完毕!共用时" + (end2003 - start2003) + "毫秒!");
     
    long start2007 = System.currentTimeMillis();
    System.out.println("Excel文件路径:" + path2007);
    List<User> list2007 = parseExcel(path2007);
    System.out.println("解析2007输出总人数:" + list2007.size());
    long end2007 = System.currentTimeMillis();
    System.out.println("解析Excel完毕!共用时" + (end2007 - start2007) + "毫秒!");
     
    System.out.println("》》》》》》》》》》开始执行Excel文件导出:");
    buildXSLExcel();// 导出Excel 2003
    buildXSLXExcel();// 导出Excel 2007
    }
     
    /**
    * 根据路径加载解析Excel
    * @param path
    * @return
    */
    public static List<User> parseExcel(String path) {
    List<User> list = new ArrayList<User>();
    File file = null;
    InputStream input = null;
    Workbook workBook = null;
    Sheet sheet = null;
    if (path != null && path.length() > 7) {
    // 判断文件是否是Excel(2003、2007)
    String suffix = path
    .substring(path.lastIndexOf("."), path.length());
    if (".xls".equals(suffix) || ".xlsx".equals(suffix)) {// 2003后缀或2007后缀
    file = new File(path);
    try {
    input = new FileInputStream(file);
    } catch (FileNotFoundException e) {
    System.out.println("未找到指定的文件!");
    e.printStackTrace();
    } catch (Exception e) {
    System.out.println("读取Excel文件发生异常!");
    e.printStackTrace();
    }
    if (!input.markSupported()) {
    input = new PushbackInputStream(input, 8);
    }
    try {
    if (POIFSFileSystem.hasPOIFSHeader(input)
    || POIXMLDocument.hasOOXMLHeader(input)) {
    workBook = WorkbookFactory.create(input);
    } else {
    System.out.println("非法的输入流:当前输入流非OLE2流或OOXML流!");
    }
    } catch (IOException e) {
    System.out.println("创建表格工作簿对象发生IO异常!原因:" + e.getMessage());
    e.printStackTrace();
    } catch (InvalidFormatException e) {
    // Your InputStream was neither an OLE2 stream, nor an OOXML
    // stream.
    System.out.println("非法的输入流:当前输入流非OLE2流或OOXML流!");
    e.printStackTrace();
    }
    try {
    if (workBook != null) {
    int numberSheet = workBook.getNumberOfSheets();
    if (numberSheet > 0) {
    sheet = workBook.getSheetAt(0);// 获取第一个工作簿(Sheet)的内容【注意根据实际需要进行修改】
    list = getExcelContent(sheet);
    } else {
    System.out.println("目标表格工作簿(Sheet)数目为0!");
    }
    }
    input.close();
    } catch (IOException e) {
    System.out.println("关闭输入流异常!" + e.getMessage());
    e.printStackTrace();
    }
    } else {
    System.out.println("非法的Excel文件后缀!");
    }
    } else {
    System.out.println("非法的文件路径!");
    }
    return list;
    }
     
    /**
    * 解析(读取)Excel内容
    * @param sheet
    * @return
    */
    @SuppressWarnings("static-access")
    public static List<User> getExcelContent(Sheet sheet) {
    List<User> list = new ArrayList<User>();
    int rowCount = sheet.getPhysicalNumberOfRows();// 总行数
    if (rowCount > 1) {
    Row titleRow = sheet.getRow(0);// 标题行
    for (int i = 1; i < rowCount; i++) {// 遍历行,略过标题行,从第二行开始
    Row row = sheet.getRow(i);
    User entity = new User();
    for (int j = 0; j < 3; j++) {
    Cell cell = row.getCell(j);
    if (titleRow.getCell(j).getStringCellValue().indexOf("姓名") >= 0) {
    if (cell != null
    && cell.getCellType() == cell.CELL_TYPE_STRING) {
    entity.setName(cell.getStringCellValue().trim());
    }
    }
    if (titleRow.getCell(j).getStringCellValue().indexOf("性别") >= 0) {
    if (cell != null
    && cell.getCellType() == cell.CELL_TYPE_STRING) {
    entity.setSex(cell.getStringCellValue().trim());
    }
    }
    if (titleRow.getCell(j).getStringCellValue().indexOf("年龄") >= 0) {
    if (cell != null
    && cell.getCellType() == cell.CELL_TYPE_NUMERIC) {
    entity.setAge((int) cell.getNumericCellValue());
    } else if (cell != null
    && cell.getCellType() == cell.CELL_TYPE_STRING) {
    entity.setAge(Integer.parseInt(cell
    .getStringCellValue().trim()));
    }
    }
    }
    list.add(entity);
    }
    }
    return list;
    }
     
    /**
    * 生成2003 Excel
    */
    public static void buildXSLExcel() {
    SimpleDateFormat format = new SimpleDateFormat("yyyyMMddhhmmss");
    String now = format.format(new Date());
    String basePath = System.getProperties().getProperty("user.dir")
    + File.separator + "Excel" + File.separator;
    String exportFileName = "人员信息导出2003_" + now + ".xls";// 导出文件名
     
    List<User> list = parseExcel(basePath + "user_2003.xls");
    HSSFWorkbook workBook = null;
    String[] cellTitle = { "序号", "姓名", "性别", "年龄" };
    try {
    workBook = new HSSFWorkbook();// 创建工作薄
    HSSFSheet sheet = workBook.createSheet();
    workBook.setSheetName(0, "人员信息");// 工作簿名称
    HSSFFont font = workBook.createFont();
    font.setColor(HSSFFont.COLOR_NORMAL);
    font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
    HSSFCellStyle cellStyle = workBook.createCellStyle();// 创建格式
    cellStyle.setFont(font);
    cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
    cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
    // 创建第一行标题
    HSSFRow titleRow = sheet.createRow((short) 0);// 第一行标题
    for (int i = 0, size = cellTitle.length; i < size; i++) {// 创建第1行标题单元格
    switch (i) {
    case 0:
    sheet.setColumnWidth(0, 3000);
    break;
    case 1:
    sheet.setColumnWidth(1, 4000);
    break;
    case 2:
    sheet.setColumnWidth(2, 4000);
    break;
    case 3:
    sheet.setColumnWidth(3, 2000);
    break;
    }
    HSSFCell cell = titleRow.createCell(i, 0);
    cell.setCellStyle(cellStyle);
    cell.setCellValue(cellTitle[i]);
    }
    // 从第二行开始写入数据
    // 注:此处如果数据过多,会抛出java.lang.IllegalStateException异常:The maximum
    // number of cell styles was exceeded.
    // You can define up to 4000 styles in a .xls workbook。这是是由于cell
    // styles太多create造成,故一般可以把cellstyle设置放到循环外面
     
    if (list != null && !list.isEmpty()) {
    HSSFCellStyle style = workBook.createCellStyle();// 创建格式
    for (int i = 0, size = list.size(); i < size; i++) {
    User entity = list.get(i);
    HSSFRow row = sheet.createRow((short) i + 1);
    for (int j = 0, length = cellTitle.length; j < length; j++) {
    HSSFCell cell = row.createCell(j, 0);// 在上面行索引0的位置创建单元格
    cell.setCellType(HSSFCell.CELL_TYPE_STRING);// 定义单元格为字符串类型
    switch (j) {// 在单元格中输入一些内容
    case 0:// 序号
    cell.setCellValue(i + 1);
    style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
    cell.setCellStyle(style);
    break;
    case 1:// 姓名
    cell.setCellValue(entity.getName());
    style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
    cell.setCellStyle(style);
    break;
    case 2:// 性别
    cell.setCellValue(String.valueOf(entity.getSex()));
    style.setAlignment(HSSFCellStyle.ALIGN_LEFT);
    cell.setCellStyle(style);
    break;
    case 3:// 年龄
    cell.setCellValue(entity.getAge());
    cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
    style.setAlignment(HSSFCellStyle.ALIGN_LEFT);
    cell.setCellStyle(style);
    break;
    }
    }
    }
    }
     
    // 通过文件输出流生成Excel文件
    File file = new File(basePath + exportFileName);
    FileOutputStream outStream = new FileOutputStream(file);
    workBook.write(outStream);
    outStream.flush();
    outStream.close();
    System.out.println("Excel 2003文件导出完成!导出文件路径:" + file.getPath());
     
    /***
    * Web形式输出Excel
    */
    /**
    * // 表示以附件的形式把文件发送到客户端 response.setHeader("Content-Disposition",
    * "attachment;filename=" + new String((exportFileName).getBytes(),
    * "ISO-8859-1"));//设定输出文件头 response.setContentType(
    * "application/vnd.ms-excel;charset=UTF-8");// 定义输出类型 //
    * 通过response的输出流把工作薄的流发送浏览器形成文件 OutputStream outStream =
    * response.getOutputStream(); workBook.write(outStream);
    * outStream.flush();
    */
    } catch (IOException e) {
    System.out.println("生成人员信息Excel发生IO 异常!" + e.getMessage());
    e.printStackTrace();
    } catch (Exception e) {
    System.out.println("文件导出发生异常!异常原因:" + e.getMessage());
    e.printStackTrace();
    }
    }
     
    /**
    * 生成2007 Excel
    */
    public static void buildXSLXExcel() {
    SimpleDateFormat format = new SimpleDateFormat("yyyyMMddhhmmss");
    String now = format.format(new Date());
    String basePath = System.getProperties().getProperty("user.dir")
    + File.separator + "Excel" + File.separator;
    String exportFileName = "人员信息导出2007_" + now + ".xlsx";// 导出文件名
     
    List<User> list = parseExcel(basePath + "user_2003.xls");
    XSSFWorkbook workBook = null;
    String[] cellTitle = { "序号", "姓名", "性别", "年龄" };
    try {
    workBook = new XSSFWorkbook();// 创建工作薄
    XSSFSheet sheet = workBook.createSheet();
    workBook.setSheetName(0, "人员信息");// 工作簿名称
    XSSFFont font = workBook.createFont();
    font.setColor(XSSFFont.COLOR_NORMAL);
    font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
    XSSFCellStyle cellStyle = workBook.createCellStyle();// 创建格式
    cellStyle.setFont(font);
    cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
    cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
    // 创建第一行标题
    XSSFRow titleRow = sheet.createRow((short) 0);// 第一行标题
    for (int i = 0, size = cellTitle.length; i < size; i++) {// 创建第1行标题单元格
    switch (i) {
    case 0:
    sheet.setColumnWidth(0, 3000);
    break;
    case 1:
    sheet.setColumnWidth(1, 4000);
    break;
    case 2:
    sheet.setColumnWidth(2, 4000);
    break;
    case 3:
    sheet.setColumnWidth(3, 2000);
    break;
    }
    XSSFCell cell = titleRow.createCell(i, 0);
    cell.setCellStyle(cellStyle);
    cell.setCellType(XSSFCell.CELL_TYPE_STRING);
    cell.setCellValue(cellTitle[i]);
    }
    // 从第二行开始写入数据
    // 注:此处如果数据过多,会抛出java.lang.IllegalStateException异常:The maximum
    // number of cell styles was exceeded.
    // You can define up to 4000 styles in a .xls workbook。这是是由于cell
    // styles太多create造成,故一般可以把cellstyle设置放到循环外面
     
    if (list != null && !list.isEmpty()) {
    XSSFCellStyle style = workBook.createCellStyle();// 创建格式
    for (int i = 0, size = list.size(); i < size; i++) {
    User entity = list.get(i);
    XSSFRow row = sheet.createRow((short) i + 1);
    for (int j = 0, length = cellTitle.length; j < length; j++) {
    XSSFCell cell = row.createCell(j, 0);// 在上面行索引0的位置创建单元格
    cell.setCellType(XSSFCell.CELL_TYPE_STRING);// 定义单元格为字符串类型
    switch (j) {// 在单元格中输入一些内容
    case 0:// 序号
    cell.setCellValue(i + 1);
    style.setAlignment(XSSFCellStyle.ALIGN_CENTER);
    cell.setCellStyle(style);
    break;
    case 1:// 姓名
    cell.setCellValue(entity.getName());
    style.setAlignment(XSSFCellStyle.ALIGN_CENTER);
    cell.setCellStyle(style);
    break;
    case 2:// 性别
    cell.setCellValue(String.valueOf(entity.getSex()));
    style.setAlignment(XSSFCellStyle.ALIGN_LEFT);
    cell.setCellStyle(style);
    break;
    case 3:// 年龄
    cell.setCellValue(entity.getAge());
    cell.setCellType(XSSFCell.CELL_TYPE_NUMERIC);
    style.setAlignment(XSSFCellStyle.ALIGN_LEFT);
    cell.setCellStyle(style);
    break;
    }
    }
    }
    }
     
    // 通过文件输出流生成Excel文件
    File file = new File(basePath + exportFileName);
    FileOutputStream outStream = new FileOutputStream(file);
    workBook.write(outStream);
    outStream.flush();
    outStream.close();
    System.out.println("Excel 2007文件导出完成!导出文件路径:" + file.getPath());
     
    /***
    * Web形式输出Excel
    */
    /**
    * // 表示以附件的形式把文件发送到客户端 response.setHeader("Content-Disposition",
    * "attachment;filename=" + new String((exportFileName).getBytes(),
    * "ISO-8859-1"));//设定输出文件头 response.setContentType(
    * "application/vnd.ms-excel;charset=UTF-8");// 定义输出类型 //
    * 通过response的输出流把工作薄的流发送浏览器形成文件 OutputStream outStream =
    * response.getOutputStream(); workBook.write(outStream);
    * outStream.flush();
    */
    } catch (IOException e) {
    System.out.println("生成人员信息Excel发生IO 异常!" + e.getMessage());
    e.printStackTrace();
    } catch (Exception e) {
    System.out.println("文件导出发生异常!异常原因:" + e.getMessage());
    e.printStackTrace();
    }
    }
    }
     
    class User {
    private String name;
    private String sex;
    private int age;
     
    public String getName() {
    return name;
    }
     
    public void setName(String name) {
    this.name = name;
    }
     
    public String getSex() {
    return sex;
    }
     
    public void setSex(String sex) {
    this.sex = sex;
    }
     
    public int getAge() {
    return age;
    }
     
    public void setAge(int age) {
    this.age = age;
    }
     
    }
  • 相关阅读:
    Java中Date日期字符串格式的各种转换
    Redis集群搭建与简单使用
    Java中的Redis应用
    java的linux命令
    Lucene全文检索引擎
    设置Xshell中支持中文
    Java并发Fork-Join框架原理解析
    java线程
    Django-路由层
    Django简介
  • 原文地址:https://www.cnblogs.com/jym-sunshine/p/4912435.html
Copyright © 2011-2022 走看看