Java Poi创建与读取Excel

本文涉及的产品
可视分析地图(DataV-Atlas),3 个项目,100M 存储空间
简介: Apache POI 下载创建Excel表public class Test { /** 存储路径 */ private static String path = "E:/Student.

Apache POI 下载

  1. 创建Excel表
public class Test {
    /** 存储路径 */
    private static String path = "E:/Student.xls";
    /** 列表信息 */
    private static List<Student> mList;
    /** 工作簿 */
    private static HSSFWorkbook workbook;
    /** 格式化时间 */
    static SimpleDateFormat dateFormat;
    static {
        mList = new ArrayList<Student>();
        dateFormat = new SimpleDateFormat("yyyy-mm-dd");
        try {
            Student user1 = new Student(1, "张三", 16, dateFormat.parse("1997-03-12"));
            Student user2 = new Student(2, "李四", 17, dateFormat.parse("1996-08-12"));
            Student user3 = new Student(3, "王五", 26, dateFormat.parse("1985-11-12"));
            mList.add(user1);
            mList.add(user2);
            mList.add(user3);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

    /**
     * 主函数
     */
    public static void main(String[] args) {
        // 创建一个工作簿
        workbook = new HSSFWorkbook();
        // 第二步, 在WebBook中添加一个sheet,对应Excel中的sheet
        HSSFSheet sheet = workbook.createSheet("学生表一");
        // 第三步, 在sheet中添加表头第0行
        HSSFRow row = sheet.createRow(0);
        // 第四步, 创建单元格, 并设置值表头, 设置表头居中
        HSSFCellStyle style = workbook.createCellStyle();
        // 创建一个居中显示的头
        style.setAlignment(HorizontalAlignment.CENTER);
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);

        // 创建第一行
        HSSFCell cell = row.createCell(0);
        cell.setCellValue("学号");
        cell.setCellStyle(style);

        cell = row.createCell(1);
        cell.setCellValue("姓名");
        cell.setCellStyle(style);

        cell = row.createCell(2);
        cell.setCellValue("年龄");
        cell.setCellStyle(style);

        cell = row.createCell(3);
        cell.setCellValue("生日");
        cell.setCellStyle(style);

        String[] textlist = { "16", "17", "26", "20", "23" };
        // 创建下拉列表
        sheet = setHSSFValidation(sheet, textlist, 0, 500, 2, 2);

        // 写入实体数据
        for (int i = 0; i < mList.size(); i++) {
            row = sheet.createRow(i + 1);
            Student student = mList.get(i);
            // 第四步,创建单元格并设置值
            row.createCell(0).setCellValue(student.getId());
            row.createCell(1).setCellValue(student.getName());
            row.createCell(2).setCellValue(student.getAge());
            row.createCell(3).setCellValue(dateFormat.format(student.getBirth()));
        }

        try {
            FileOutputStream fos = new FileOutputStream(path);
            workbook.write(fos);
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 设置某些列的值只能输入预制的数据,显示下拉框.
     * @param sheet 要设置的sheet.
     * @param textlist 下拉框显示的内容
     * @param firstRow 开始行
     * @param endRow 结束行
     * @param firstCol 开始列
     * @param endCol 结束列
     * @return 设置好的sheet.
     */
    private static HSSFSheet setHSSFValidation(HSSFSheet sheet, String[] textlist, int firstRow, int lastRow,
            int firstCol, int lastCol) {
        // 加载下拉列表内容
        DVConstraint constraint = DVConstraint.createExplicitListConstraint(textlist);
        // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列
        CellRangeAddressList regions = new CellRangeAddressList(firstRow, lastRow, firstCol, lastCol);
        // 数据有效性对象
        HSSFDataValidation dataValidation = new HSSFDataValidation(regions, constraint);
        sheet.addValidationData(dataValidation);
        return sheet;
    }
    
    /**
     * 设置单元格上提示
     * @param sheet  要设置的sheet.
     * @param promptTitle 标题
     * @param promptContent 内容
     * @param firstRow 开始行
     * @param endRow  结束行
     * @param firstCol  开始列
     * @param endCol  结束列
     * @return 设置好的sheet.
     */
    public static HSSFSheet setHSSFPrompt(HSSFSheet sheet, String promptTitle,
            String promptContent, int firstRow, int endRow ,int firstCol,int endCol) {
        // 构造constraint对象
        DVConstraint constraint = DVConstraint.createCustomFormulaConstraint("BB1");
        // 四个参数分别是:起始行、终止行、起始列、终止列
        CellRangeAddressList regions = new CellRangeAddressList(firstRow,endRow,firstCol, endCol);
        // 数据有效性对象
        HSSFDataValidation data_validation_view = new HSSFDataValidation(regions,constraint);
        data_validation_view.createPromptBox(promptTitle, promptContent);
        sheet.addValidationData(data_validation_view);
        return sheet;
    }
}
  1. 读取Excel表
  
/** 
 * 读取Excel表格的功能类 
 */  
public class ExcelReader {  
    private POIFSFileSystem fs;  
    private HSSFWorkbook wb;  
    private HSSFSheet sheet;  
    private HSSFRow row;  
  
    /** 
     * 读取Excel表格表头的内容 
     * @param InputStream 
     * @return String 表头内容的数组 
     */  
    public String[] readExcelTitle(InputStream is) {  
        try {  
            fs = new POIFSFileSystem(is);  
            wb = new HSSFWorkbook(fs);  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        sheet = wb.getSheetAt(0);  
        row = sheet.getRow(0);  
        // 标题总列数  
        int colNum = row.getPhysicalNumberOfCells();  
        System.out.println("colNum:" + colNum);  
        String[] title = new String[colNum];  
        for (int i = 0; i < colNum; i++) {  
            //title[i] = getStringCellValue(row.getCell((short) i));  
            title[i] = getCellFormatValue(row.getCell((short) i));  
        }  
        return title;  
    }  
  
    /** 
     * 读取Excel数据内容 
     * @param InputStream 
     * @return Map 包含单元格数据内容的Map对象 
     */  
    public Map<Integer, String> readExcelContent(InputStream is) {  
        Map<Integer, String> content = new HashMap<Integer, String>();  
        String str = "";  
        try {  
            fs = new POIFSFileSystem(is);  
            wb = new HSSFWorkbook(fs);  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        sheet = wb.getSheetAt(0);  
        // 得到总行数  
        int rowNum = sheet.getLastRowNum();  
        row = sheet.getRow(0);  
        int colNum = row.getPhysicalNumberOfCells();  
        // 正文内容应该从第二行开始,第一行为表头的标题  
        for (int i = 1; i <= rowNum; i++) {  
            row = sheet.getRow(i);  
            int j = 0;  
            while (j < colNum) {  
                // 每个单元格的数据内容用"-"分割开,以后需要时用String类的replace()方法还原数据  
                // 也可以将每个单元格的数据设置到一个javabean的属性中,此时需要新建一个javabean  
                // str += getStringCellValue(row.getCell((short) j)).trim() +  
                // "-";  
                str += getCellFormatValue(row.getCell((short) j)).trim() + "    ";  
                j++;  
            }  
            content.put(i, str);  
            str = "";  
        }  
        return content;  
    }  
  
    /** 
     * 获取单元格数据内容为字符串类型的数据 
     *  
     * @param cell Excel单元格 
     * @return String 单元格数据内容 
     */  
    private String getStringCellValue(HSSFCell cell) {  
        if (null == cell) {  
            return "";  
        }
        String strCell = "";
        switch (cell.getCellTypeEnum()) {
        case STRING:
            strCell = cell.getStringCellValue();  
            break;  
        case NUMERIC:  
            strCell = String.valueOf(cell.getNumericCellValue());  
            break;  
        case BOOLEAN:  
            strCell = String.valueOf(cell.getBooleanCellValue());  
            break;  
        case BLANK:  
            strCell = "";  
            break;  
        default:  
            strCell = "";  
            break;  
        }  
        if (strCell.equals("") || strCell == null) {  
            return "";  
        }    
        return strCell;  
    }  
  
    /** 
     * 获取单元格数据内容为日期类型的数据 
     *  
     * @param cell 
     *            Excel单元格 
     * @return String 单元格数据内容 
     */  
    private String getDateCellValue(HSSFCell cell) {  
        String result = "";  
        try {  
            CellType cellType = cell.getCellTypeEnum();  
            if (cellType == CellType.NUMERIC) {  
                Date date = cell.getDateCellValue();  
                result = (date.getYear() + 1900) + "-" + (date.getMonth() + 1)  
                        + "-" + date.getDate();  
            } else if (cellType == CellType.STRING) {  
                String date = getStringCellValue(cell);  
                result = date.replaceAll("[年月]", "-").replace("日", "").trim();  
            } else if (cellType == CellType.BLANK) {  
                result = "";  
            }  
        } catch (Exception e) {  
            System.out.println("日期格式不正确!");  
            e.printStackTrace();  
        }  
        return result;  
    }  
  
    /** 
     * 根据HSSFCell类型设置数据 
     * @param cell 
     * @return 
     */  
    private String getCellFormatValue(HSSFCell cell) {  
        String cellvalue = "";  
        if (cell != null) {  
            // 判断当前Cell的Type  
            switch (cell.getCellTypeEnum()) {  
            // 如果当前Cell的Type为NUMERIC  
            case NUMERIC:  
            case FORMULA: {  
                // 判断当前的cell是否为Date  
                if (HSSFDateUtil.isCellDateFormatted(cell)) {  
                    // 如果是Date类型则,转化为Data格式  
                      
                    //方法1:这样子的data格式是带时分秒的:2011-10-12 0:00:00  
                    //cellvalue = cell.getDateCellValue().toLocaleString();  
                      
                    //方法2:这样子的data格式是不带带时分秒的:2011-10-12  
                    Date date = cell.getDateCellValue();  
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");  
                    cellvalue = sdf.format(date);  
                      
                }  
                // 如果是纯数字  
                else {  
                    // 取得当前Cell的数值  
                    cellvalue = String.valueOf(cell.getNumericCellValue());  
                }  
                break;  
            }  
            // 如果当前Cell的Type为STRIN  
            case STRING:  
                // 取得当前的Cell字符串  
                cellvalue = cell.getRichStringCellValue().getString();  
                break;  
            // 默认的Cell值  
            default:  
                cellvalue = " ";  
            }  
        } else {  
            cellvalue = "";  
        }  
        return cellvalue;  
  
    }  
  
    /** 存储路径 */
    private static String path = "E:/Student.xls";
    public static void main(String[] args) {  
        try {  
            // 对读取Excel表格标题测试  
            InputStream is = new FileInputStream(path);  
            ExcelReader excelReader = new ExcelReader();  
            String[] title = excelReader.readExcelTitle(is);  
            System.out.println("获得Excel表格的标题:");  
            for (String s : title) {  
                System.out.print(s + " ");  
            }  
            
            System.out.println("");
  
            // 对读取Excel表格内容测试  
            InputStream is2 = new FileInputStream(path);  
            Map<Integer, String> map = excelReader.readExcelContent(is2);  
            System.out.println("获得Excel表格的内容:");  
            for (int i = 1; i <= map.size(); i++) {  
                System.out.println(map.get(i));  
            }  
  
        } catch (FileNotFoundException e) {  
            System.out.println("未找到指定路径的文件!");  
            e.printStackTrace();  
        }  
    }  
}  
相关实践学习
DataV Board用户界面概览
本实验带领用户熟悉DataV Board这款可视化产品的用户界面
阿里云实时数仓实战 - 项目介绍及架构设计
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3&nbsp;)前置知识要求 &nbsp; 课程大纲 第一章&nbsp;了解数据仓库概念 初步了解数据仓库是干什么的 第二章&nbsp;按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章&nbsp;数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章&nbsp;采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章&nbsp;用户行为数据仓库 严格按照企业的标准开发 第六章&nbsp;搭建业务数仓理论基础和对表的分类同步 第七章&nbsp;业务数仓的搭建&nbsp; 业务行为数仓效果图&nbsp;&nbsp;
目录
相关文章
|
1月前
|
Java API Apache
Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
【10月更文挑战第29天】Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
119 5
|
23天前
|
Java BI API
Java Excel报表生成:JXLS库的高效应用
在Java应用开发中,经常需要将数据导出到Excel文件中,以便于数据的分析和共享。JXLS库是一个强大的工具,它基于Apache POI,提供了一种简单而高效的方式来生成Excel报表。本文将详细介绍JXLS库的使用方法和技巧,帮助你快速掌握Java中的Excel导出功能。
53 6
|
1月前
|
Java API Apache
|
1月前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
41 4
|
2月前
|
前端开发 JavaScript Java
导出excel的两个方式:前端vue+XLSX 导出excel,vue+后端POI 导出excel,并进行分析、比较
这篇文章介绍了使用前端Vue框架结合XLSX库和后端结合Apache POI库导出Excel文件的两种方法,并对比分析了它们的优缺点。
546 0
|
3月前
|
存储 Java
java的Excel导出,数组与业务字典匹配并去掉最后一个逗号
java的Excel导出,数组与业务字典匹配并去掉最后一个逗号
54 2
|
2月前
|
Java Apache
Apache POI java对excel表格进行操作(读、写) 有代码!!!
文章提供了使用Apache POI库在Java中创建和读取Excel文件的详细代码示例,包括写入数据到Excel和从Excel读取数据的方法。
49 0
|
3月前
|
Java Apache Maven
Java中使用poi+poi-tl实现根据模板导出word文档
这个过程不仅简化了文档生成的工作,而且保证了生成文档的一致性与准确性,特别适合于那些需要生成大量文档的自动化场景。通过以上步骤,Java开发人员可以实现高效、可靠的Word文档导出功能。
1534 0
|
Java API 图形学
JAVA读取EMF文件并转化为PNG,JPG,GIF格式
JAVA读取EMF文件并转化为PNG,JPG,GIF格式 使用第三方库下载地址为:http://java.freehep.org/vectorgraphics/index.html 主要思路: 使用EMFInputStream读取EMF文件,然后使用EMFRenderer对象将EMF绘制到创建 好的空白的BufferedImage里面。
2115 0
|
13天前
|
设计模式 Java 开发者
Java多线程编程的陷阱与解决方案####
本文深入探讨了Java多线程编程中常见的问题及其解决策略。通过分析竞态条件、死锁、活锁等典型场景,并结合代码示例和实用技巧,帮助开发者有效避免这些陷阱,提升并发程序的稳定性和性能。 ####