栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

POI学习应用——excel

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

POI学习应用——excel

一、官网 http://poi.apache.org/download.html 提供的POI相关jar包不适用于单工程,要配合maven使用

二、单工程要用到的包如下,各位可点击下载配合使用
POI用到的jar包
三、本文用到的是 HSSF的 xls格式的展示例子,XSSF是xlsx格式的,需要变更时变更下面代码中的workbook类型即可。
各类型优劣:
XLS的写入快,但大小有限制,最多只能写入65536行数据。默认每次处理100行数据,之前的数据会存入临时的xml文件。所以不易发生内存溢出错误。
XLSX的无限制,但写入相对慢,XLSX是直接在内存中进行写操作,因此内存不充裕的服务器会面临内存溢出问题。可通过SXSSFWorkbook对象的dispose()方法对非托管资源进行资源释放操作。
SXSSFWorkbook解决了写入大量数据内存和磁盘占用空间太大的问题,但就需要舍弃些效率实现了。
参考来源:浅谈POI-HSSF、XSSF 、 SXSSF

四、下面是POI读写栗子

POI读取EXCEL内容
 
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;

import java.io.FileInputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;



public class MyExcelInput {
    public static void main(String[] args) throws Exception {
        String fileName = "i://test.xls";
        readExcel(fileName);
    }

    public static void readExcel(String fileName) throws Exception {
//        读取文件
        InputStream inputStream = new FileInputStream(fileName);
//        找到工作簿
        Workbook workbook = new HSSFWorkbook(inputStream);//xls接收对象
//       找到对应的sheet
        Sheet sheet = workbook.getSheetAt(0);//0表示第一个sheet
//        得到物理行数
        int rowCount = sheet.getPhysicalNumberOfRows();
//        根据物理行数,读取每一格内容
        for (int i = 0; i < rowCount; i++) {
//            读取每一行内容
            Row rowData = sheet.getRow(i);
            if (rowData != null) {
//                由物理列数,得到总共由几列
                int cellCount = rowData.getPhysicalNumberOfCells();
                for (int j = 0; j < cellCount; j++) {
                    //读取每一行每一列的值
                    Cell cell = rowData.getCell(j);
                    String cellValue = "";
                    if (cell != null) {
//                        获取类型,根据类型获取对应的值
                        CellType cellType = cell.getCellType();
                        switch (cellType) {
//                            case HSSFCell.CELL_TYPE_BOOLEAN: //poi3.15开始已不能用
                            case STRING: //CellType.STRING
                                System.out.println("字符串类型");
                                cellValue = cell.getStringCellValue();
                                break;
                            case BOOLEAN:
                                System.out.println("布尔类型");
                                cellValue = String.valueOf(cell.getBooleanCellValue());
                                break;
                            case _NONE:
                                System.out.println("无数据null");
                                break;
                            case NUMERIC:
//                                数值类型有两种 时间戳和数值
                                if (HSSFDateUtil.isCellDateFormatted(cell)) {
                                    System.out.println("日期");
                                    Date date = cell.getDateCellValue();
                                    cellValue = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(date);
                                } else {
                                    System.out.println("数值类型");
                                    cell.setCellType(CellType.STRING);
                                    cellValue = cell.toString();
                                }
                                break;
                            case ERROR:
                                System.out.println("数据类型错误");
                                break;
                            case BLANK:
                                System.out.println("无数据");
                                break;
                            case FORMULA:
                                System.out.println("公式类型数据");
//                                得到单元格使用的公式
                                String cellFormula = cell.getCellFormula();
                                System.out.println("使用的公式是:" + cellFormula);
//                                得到计算数据
                                double numericCellValue = cell.getNumericCellValue();
                                System.out.println("计算数据为:" + numericCellValue);
                                break;
                        }
                    }
                    System.out.println(cellValue);
                }
                System.out.println("第" + (i + 1) + "行" + "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");
            }
        }
        inputStream.close();
    }
}
POI写入EXCEL 

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class MyExcelOutput {
    public static void main(String[] args) throws IOException {
        //创建工作簿
//        Workbook workbook = new HSSFWorkbook(); //XLS后缀对象,速度快,但最多只能写65536条数据
        Workbook workbook =new XSSFWorkbook(); //xlsx后缀对象
//        XSSF
        //创建sheet
        Sheet sheet = workbook.createSheet("sheet名");

//        创建行
        Row row1 = sheet.createRow(0);//第一行
        Row row2 = sheet.createRow(1);//第二行

//        设置单元格格式
        CellStyle cellStyle = workbook.createCellStyle();//单元格格式只能通过工作簿对象进行操作
//        设置水平对齐的样式为居中对齐;
//        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//可能会因为POI版本问题导致报错
        cellStyle.setAlignment(HorizontalAlignment.CENTER);//Horizontal Alignment 水平  对齐
        //设置垂直对齐的样式为居中对齐;
//        cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//同样会因为版本问题报错
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);

        //创建单元格
        Cell rowcell1 = row1.createCell(0);//A1第一行创建第一个单元格,row1是第一行对象
        rowcell1.setCellValue("姓名");//赋值
        rowcell1.setCellStyle(cellStyle);//赋予样式
        Cell rowcell2 = row1.createCell(1);//A2第一行创建第二个单元格
        rowcell2.setCellValue("年龄");
        rowcell2.setCellStyle(cellStyle);
        Cell rowcell3 = row1.createCell(2);//A3
        rowcell3.setCellValue("课程");
        rowcell3.setCellStyle(cellStyle);

        Cell row2Cell1=row2.createCell(0); //单元格2-1,row2是第二行对象
        row2Cell1.setCellValue("小明");
        row2Cell1.setCellStyle(cellStyle);
        Cell row2Cell2=row2.createCell(1);//单元格2-2
        row2Cell2.setCellValue(16);
        row2Cell2.setCellStyle(cellStyle);
        Cell row2Cell3=row2.createCell(2);//单元格2-3
        row2Cell3.setCellValue("语文");
        row2Cell3.setCellStyle(cellStyle);
        Cell row2Cell4=row2.createCell(3);//单元格2-4
        row2Cell4.setCellValue("数学");
        row2Cell4.setCellStyle(cellStyle);

        //合并单元格(起始行,结束行,起始列,结束列)
        CellRangeAddress cellAddresses = new CellRangeAddress(0,0,2,3);
        sheet.addMergedRegion(cellAddresses);//sheet对象操作单元格合并  Merged Region 合并 区域

        //要注意的是如果是行与行的合并,必须对第一行中的单元格赋值
        Cell row1to2Cell5=row1.createCell(4);
        CellRangeAddress timeRegion=new CellRangeAddress(0,1,4,4);
        sheet.addMergedRegion(timeRegion);


        String dateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime());
        System.out.println(dateTime);
        row1to2Cell5.setCellValue(dateTime);
        row1to2Cell5.setCellStyle(cellStyle);

//        PrintStream printStream = new PrintStream(new FileOutputStream("I:\TEST.xls"));
        PrintStream printStream = new PrintStream(new FileOutputStream("I:\TEST.xlsX"));
        workbook.write(printStream);
        printStream.close();
        ((SXSSFWorkbook)workbook).dispose();//xlsx内存溢出解决方法
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/298155.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号