POI工具类

POI工具类

低版本的poi包是不支持xlsx的。因为项目需要,总结了一个poi的工具类,分享一下。

我这里用的是poi4.0:

<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.0.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.0.0</version>
        </dependency>

其中,主要是读写表格,获取表格信息等方法,支持xls和xlsx,只要把知道文件路径即可

public static void main(String[] args)
    {
        try
        {
            PoiUtil eb = new PoiUtil("C:\\Users\\Administrator\\Desktop\\PathInfo.xlsx");
            
            //读表格
            List<List<String>> data = eb.readAll(0);
            //写表格
            eb.write(data,"newSheet");
            //获取sheet页数量
            System.out.println(eb.getSheetCount());
            //获取表名
            System.out.println(eb.getSheetName(0));
            //合并单元格
            eb.region("newSheet",0,2,1,3);
            eb.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

完整代码:

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;


/**
 * Excel 工具类
 *
 * @version 1.0 2016/01/27
 */
public class PoiUtil
{
    public static void main(String[] args)
    {
        try
        {
            PoiUtil eb = new PoiUtil("C:\\Users\\Administrator\\Desktop\\PathInfo.xlsx");
            
            //读表格
            List<List<String>> data = eb.readAll(0);
            //写表格
            eb.write(data,"newSheet");
            //获取sheet页数量
            System.out.println(eb.getSheetCount());
            //获取表名
            System.out.println(eb.getSheetName(0));
            //合并单元格
            eb.region("newSheet",0,2,1,3);
            eb.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    
    private Workbook workbook;
    
    private File file;
    private boolean isXlsx = false;
    
    private String pattern;// 日期格式
    
    /**
     * @param path 目标路径
     * @className PoiExcelUtil2
     * @describe 构造方法
     * @author 马广胜
     * @date 2021-5-26 15:32
     */
    public PoiUtil(String path)
    {
        try
        {
            if (path.endsWith(".xls"))
            {
                file = new File(path);
                
                if (!file.exists())
                {
                    file.createNewFile();
                    workbook = new HSSFWorkbook();
                }
                else
                {
                    InputStream fis = new FileInputStream(file);
                    workbook = new HSSFWorkbook(fis);
                    
                    fis.close();
                }
            }
            else if (path.endsWith(".xlsx"))
            {
                file = new File(path);
                isXlsx = true;
                
                if (!file.exists())
                {
                    file.createNewFile();
                    workbook = new SXSSFWorkbook(-1);
                }
                else
                {
                    InputStream fis = new FileInputStream(file);
                    XSSFWorkbook xssfWorkbook = new XSSFWorkbook(fis);
                    workbook = new SXSSFWorkbook(xssfWorkbook, -1);
                    fis.close();
                }
            }
            
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    
    /**
     * 根据后缀判断是否为 Excel 文件,后缀匹配xls和xlsx
     *
     * @param path 路径
     * @return true OR false
     */
    public static boolean isExcel(String path)
    {
        if (path == null)
        {
            return false;
        }
        return path.endsWith(".xls") || path.endsWith(".xlsx");
    }
    
    /**
     * 设置日期格式
     */
    public void setPattern(String pattern)
    {
        this.pattern = pattern;
    }
    
    @Override
    public String toString()
    {
        return getClass().getSimpleName();
    }
    
    public String toString(int sheetIx)
    {
        return "第 " + (sheetIx) + "个sheet 页,名称: " + getSheetName(sheetIx) + ",共 " + getRowCount(sheetIx) + "行!";
    }
    
    /**
     * 复制sheet页
     *
     * @param sheetNum sheet页序号
     * @param count    复制数量
     * @return 结果
     */
    public boolean cloneSheet(int sheetNum, int count)
    {
        try
        {
            //xlsx格式。将SXSSFWorkbook转成XSSFWorkbook,再获取XSSFSheet
            if (isXlsx)
            {
                XSSFWorkbook xssfWorkbook = ((SXSSFWorkbook) workbook).getXSSFWorkbook();
                XSSFSheet sheet = xssfWorkbook.getSheetAt(sheetNum);
                if (Objects.isNull(sheet))
                {
                    return false;
                }
                for (int i = 0; i < count; i++)
                {
                    xssfWorkbook.cloneSheet(sheetNum);
                }
            }
            //xls格式,直接读取
            else
            {
                Sheet sheet = workbook.getSheetAt(sheetNum);
                if (Objects.isNull(sheet))
                {
                    return false;
                }
                for (int i = 0; i < count; i++)
                {
                    workbook.cloneSheet(sheetNum);
                }
            }
            
            return true;
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return false;
        }
    }
    
    /**
     * 获取 sheet名称
     *
     * @param sheetIx 指定 Sheet 页,从 0 开始
     * @return sheet名称
     */
    public String getSheetName(int sheetIx)
    {
        return workbook.getSheetName(sheetIx);
    }
    
    /**
     * 返回sheet 中的行数
     *
     * @param sheetIx 指定 Sheet 页,从 0 开始
     */
    public int getRowCount(int sheetIx)
    {
        //xlsx格式。将SXSSFWorkbook转成XSSFWorkbook,再获取XSSFSheet
        if (isXlsx)
        {
            XSSFSheet sheet = ((SXSSFWorkbook) workbook).getXSSFWorkbook().getSheetAt(sheetIx);
            return sheet.getPhysicalNumberOfRows();
        }
        //xls格式,直接读取
        else
        {
            Sheet sheet = workbook.getSheetAt(sheetIx);
            return sheet.getPhysicalNumberOfRows();
        }
    }
    
    /**
     * 清空指定sheet页(先删除后添加并指定sheetIx)
     */
    public boolean clearSheet(String sheetName)
    {
        int index = workbook.getSheetIndex(sheetName);
        if (index != -1)
        {
            removeSheetAt(index);
        }
        workbook.createSheet(sheetName);
        if (index != -1)
        {
            setSheetOrder(sheetName, index);
        }
        return true;
    }
    
    /**
     * 设置sheet 页的索引
     *
     * @param sheetname Sheet 名称
     * @param sheetIx   索引,从0开始
     */
    public void setSheetOrder(String sheetname, int sheetIx)
    {
        workbook.setSheetOrder(sheetname, sheetIx);
    }
    
    /**
     * 将数据追加到sheet页最后
     *
     * @param rowData  数据
     * @param isAppend 是否追加,true 追加,false 重置sheet再添加
     */
    public boolean write(List<List<String>> rowData, String sheetName, boolean isAppend)
    {
        if (isAppend)
        {
            int row = 0;
            if (workbook.getSheetIndex(sheetName) == -1)
            {
                workbook.createSheet(sheetName);
            }
            else
            {
                Sheet sheet = workbook.getSheet(sheetName);
                row = sheet.getLastRowNum() + 1;
            }
            
            return write(sheetName, rowData, row);
        }
        else
        {
            // 清空再添加
            clearSheet(sheetName);
            return write(sheetName, rowData, 0);
        }
        
        
    }
    
    /**
     * 将数据写入到 Excel 新创建的 Sheet 页
     *
     * @param rowData   数据
     * @param sheetName 长度为1-31,不能包含后面任一字符: :\ / ? * [ ]
     */
    public boolean write(List<List<String>> rowData, String sheetName)
    {
        boolean flag = false;
        try
        {
            if (workbook.getSheetIndex(sheetName) == -1)
            {
                workbook.createSheet(sheetName);
            }
            flag = write(sheetName, rowData, 0);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        
        return flag;
    }
    
    
    /**
     * 将数据写入到 Excel 指定 Sheet 页指定开始行中,指定行后面数据向后移动
     *
     * @param rowData   数据
     * @param sheetName 指定 Sheet 页,从 0 开始
     * @param startRow  指定开始行,从 0 开始
     */
    private boolean write(String sheetName, List<List<String>> rowData, int startRow)
    {
        try
        {
            Sheet sheet = workbook.getSheet(sheetName);
            int dataSize = rowData.size();
            if (sheet.getLastRowNum() > 0)
            {
                // 如果小于等于0,则一行都不存在
                sheet.shiftRows(startRow, sheet.getLastRowNum(), dataSize);
            }
            
            CellStyle style = workbook.createCellStyle();

//            // 内容居中 3.0版本
//            style.setAlignment(ExtendedFormatRecord.CENTER);
//            //垂直居中
//            style.setVerticalAlignment(ExtendedFormatRecord.VERTICAL_CENTER);
            
            style.setAlignment(HorizontalAlignment.CENTER);
            style.setVerticalAlignment(VerticalAlignment.CENTER);
            
            DataFormat format = workbook.createDataFormat();
            // 内容样式 设置单元格内容格式是文本
            style.setDataFormat(format.getFormat("@"));
            
            for (int i = 0; i < dataSize; i++)
            {
                Row row = sheet.createRow(i + startRow);
                
                for (int j = 0; j < rowData.get(i).size(); j++)
                {
                    Cell cell = row.createCell(j);
                    cell.setCellValue(rowData.get(i).get(j));
                    cell.setCellStyle(style);
                }
            }
            
            return true;
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return false;
        }
    }
    
    
    /**
     * 设置cell 样式
     *
     * @param sheetIx  指定 Sheet 页,从 0 开始
     * @param rowIndex 指定行,从 0 开始
     * @param colIndex 指定列,从 0 开始
     * @param style    风格
     */
    public boolean setStyle(int sheetIx, int rowIndex, int colIndex, CellStyle style)
    {
        try
        {
            Sheet sheet = workbook.getSheetAt(sheetIx);
            Cell cell = sheet.getRow(rowIndex).getCell((short) colIndex);
            cell.setCellStyle(style);
//            sheet.autoSizeColumn((short) colIndex);
            return true;
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return false;
        }
    }
    
    /**
     * 构建样式
     *
     * @param fontHeight 字体高度
     * @param fontBold   字体粗度
     * @param color      字体颜色
     * @param border     边框是否加粗
     */
    public CellStyle makeStyle(int fontHeight, int fontBold, int color, boolean border)
    {
        CellStyle style = workbook.createCellStyle();
        
        DataFormat format = workbook.createDataFormat();
        // 内容样式 设置单元格内容格式是文本
        style.setDataFormat(format.getFormat("@"));
        // 内容居中
        style.setAlignment(HorizontalAlignment.CENTER);
        if (border)
        {
            // 边框样式
            style.setBorderTop(BorderStyle.MEDIUM);
            style.setBorderRight(BorderStyle.MEDIUM);
            style.setBorderBottom(BorderStyle.MEDIUM);
            style.setBorderLeft(BorderStyle.MEDIUM);
        }
        // 文字样式
        Font font = workbook.createFont();
        font.setFontHeight((short) fontBold);
        font.setFontHeight((short) fontHeight);
        font.setColor((short) color);
        style.setFont(font);
        
        return style;
    }
    
    /**
     * 合并单元格
     *
     * @param sheetName 指定 Sheet 页,从 0 开始
     * @param firstRow  开始行
     * @param lastRow   结束行
     * @param firstCol  开始列
     * @param lastCol   结束列
     */
    public void region(String sheetName, int firstRow, int lastRow, int firstCol, int lastCol)
    {
        if (lastRow == firstRow && lastCol == firstCol)
        {
            return;
        }
        
        Sheet sheet = workbook.getSheet(sheetName);
        sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, (short) firstCol, (short) lastCol));
        
        CellStyle style = workbook.createCellStyle();
        // 内容居中
        style.setAlignment(HorizontalAlignment.CENTER);
        //垂直居中
        style.setVerticalAlignment(VerticalAlignment.CENTER);
        Row row = sheet.getRow(firstRow);
        Cell cell = row.getCell((short) firstCol);
        cell.setCellStyle(style);
    }
    
    /**
     * 读取指定sheet 页所有数据
     *
     * @param sheetIx 指定 sheet 页,从 0 开始
     */
    public List<List<String>> readAll(int sheetIx)
    {
        return read(sheetIx, 0, getRowCount(sheetIx) - 1);
    }
    
    /**
     * 读取指定sheet 页指定行数据
     *
     * @param sheetIx 指定 sheet 页,从 0 开始
     * @param start   指定开始行,从 0 开始
     * @param end     指定结束行,从 0 开始
     */
    public List<List<String>> read(int sheetIx, int start, int end)
    {
        if (end > getRowCount(sheetIx))
        {
            end = getRowCount(sheetIx);
        }
        
        if (isXlsx)
        {
            return getXlsxList(sheetIx, start, end);
        }
        else
        {
            return getXlsList(sheetIx, start, end);
        }
    }
    
    private List<List<String>> getXlsList(int sheetIx, int start, int end)
    {
        List<List<String>> list = new ArrayList<>();
        Sheet sheet = workbook.getSheetAt(sheetIx);
        int cols = sheet.getRow(0).getLastCellNum(); // 第一行总列数
        
        for (int i = start; i <= end; i++)
        {
            List<String> rowList = new ArrayList<>();
            Row row = sheet.getRow(i);
            for (int j = 0; j < cols; j++)
            {
                if (row == null)
                {
                    rowList.add(null);
                    continue;
                }
                rowList.add(getCellValueToString(row.getCell((short) j)));
            }
            list.add(rowList);
        }
        return list;
    }
    
    private List<List<String>> getXlsxList(int sheetIx, int start, int end)
    {
        List<List<String>> list = new ArrayList<>();
        XSSFSheet sheet = ((SXSSFWorkbook) workbook).getXSSFWorkbook().getSheetAt(sheetIx);
        int cols = sheet.getRow(0).getLastCellNum(); // 第一行总列数
        
        for (int i = start; i <= end; i++)
        {
            List<String> rowList = new ArrayList<>();
            Row row = sheet.getRow(i);
            for (int j = 0; j < cols; j++)
            {
                if (row == null)
                {
                    rowList.add(null);
                    continue;
                }
                rowList.add(getCellValueToString(row.getCell(j)));
            }
            list.add(rowList);
        }
        return list;
    }
    
    /**
     * 指定行是否为空
     *
     * @param sheetIx  指定 Sheet 页,从 0 开始
     * @param rowIndex 指定开始行,从 0 开始
     * @return true 不为空,false 不行为空
     */
    public boolean isRowNull(int sheetIx, int rowIndex)
    {
        if (isXlsx)
        {
            XSSFSheet sheet = ((SXSSFWorkbook) workbook).getXSSFWorkbook().getSheetAt(sheetIx);
            return Objects.isNull(sheet.getRow(rowIndex));
        }
        else
        {
            Sheet sheet = workbook.getSheetAt(sheetIx);
            return Objects.isNull(sheet.getRow(rowIndex));
        }
    }
    
    /**
     * 创建行,若行存在,则清空
     *
     * @param sheetIx 指定 sheet 页,从 0 开始
     *                指定创建行,从 0 开始
     */
    public boolean createRow(int sheetIx, int rowIndex)
    {
        try
        {
            if (isXlsx)
            {
                XSSFSheet sheet = ((SXSSFWorkbook) workbook).getXSSFWorkbook().getSheetAt(sheetIx);
                XSSFRow row = sheet.getRow(rowIndex);
                if (Objects.isNull(row))
                {
                    sheet.createRow(rowIndex);
                }
            }
            else
            {
                Sheet sheet = workbook.getSheetAt(sheetIx);
                Row row = sheet.getRow(rowIndex);
                if (Objects.isNull(row))
                {
                    sheet.createRow(rowIndex);
                }
            }
            return true;
        }
        catch (Exception e)
        {
            return false;
        }
    }
    
    /**
     * 指定单元格是否为空
     *
     * @param sheetIx  指定 Sheet 页,从 0 开始
     * @param rowIndex 指定开始行,从 0 开始
     * @param colIndex 指定开始列,从 0 开始
     * @return true 行不为空,false 行为空
     */
    public boolean isCellNull(int sheetIx, int rowIndex, int colIndex)
    {
        if (isXlsx)
        {
            XSSFSheet sheet = ((SXSSFWorkbook) workbook).getXSSFWorkbook().getSheetAt(sheetIx);
            if (Objects.isNull(sheet.getRow(rowIndex)))
            {
                return false;
            }
            XSSFRow row = sheet.getRow(rowIndex);
            return Objects.isNull(row.getCell(colIndex));
        }
        else
        {
            Sheet sheet = workbook.getSheetAt(sheetIx);
            if (Objects.isNull(sheet.getRow(rowIndex)))
            {
                return false;
            }
            Row row = sheet.getRow(rowIndex);
            return Objects.isNull(row.getCell(colIndex));
        }
    }
    
    /**
     * 创建单元格
     *
     * @param sheetIx  指定 sheet 页,从 0 开始
     * @param rowIndex 指定行,从 0 开始
     * @param colIndex 指定创建列,从 0 开始
     * @return true 列为空,false 行不为空
     */
    public boolean createCell(int sheetIx, int rowIndex, int colIndex)
    {
        try
        {
            if (isXlsx)
            {
                XSSFSheet sheet = ((SXSSFWorkbook) workbook).getXSSFWorkbook().getSheetAt(sheetIx);
                XSSFRow row = sheet.getRow(rowIndex);
                if (Objects.isNull(row))
                {
                    row = sheet.createRow(rowIndex);
                }
                XSSFCell cell = row.getCell(colIndex);
                if (Objects.isNull(cell))
                {
                    row.createCell(colIndex);
                }
            }
            else
            {
                Sheet sheet = workbook.getSheetAt(sheetIx);
                Row row = sheet.getRow(rowIndex);
                if (Objects.isNull(row))
                {
                    row = sheet.createRow(rowIndex);
                }
                Cell cell = row.getCell(colIndex);
                if (Objects.isNull(cell))
                {
                    row.createCell(colIndex);
                }
            }
            return true;
        }
        catch (Exception e)
        {
            return false;
        }
    }
    
    
    /**
     * 返回所在行的列数
     *
     * @param sheetIx  指定 Sheet 页,从 0 开始
     * @param rowIndex 指定行,从0开始
     * @return 返回-1 表示所在行为空
     */
    public int getColumnCount(int sheetIx, int rowIndex)
    {
        if (isXlsx)
        {
            XSSFSheet sheet = ((SXSSFWorkbook) workbook).getXSSFWorkbook().getSheetAt(sheetIx);
            XSSFRow row = sheet.getRow(rowIndex);
            return row == null ? -1 : row.getLastCellNum();
        }
        else
        {
            Sheet sheet = workbook.getSheetAt(sheetIx);
            Row row = sheet.getRow(rowIndex);
            return row == null ? -1 : row.getLastCellNum();
        }
    }
    
    /**
     * 设置row 和 column 位置的单元格值
     *
     * @param sheetIx  指定 Sheet 页,从 0 开始
     * @param rowIndex 指定行,从0开始
     * @param colIndex 指定列,从0开始
     * @param value    值
     */
    public boolean setValueAt(int sheetIx, int rowIndex, int colIndex, String value)
    {
        try
        {
            if (isXlsx)
            {
                XSSFSheet sheet = ((SXSSFWorkbook) workbook).getXSSFWorkbook().getSheetAt(sheetIx);
                XSSFRow row = sheet.getRow(rowIndex);
                if (Objects.isNull(row))
                {
                    row = sheet.createRow(rowIndex);
                }
                XSSFCell cell = row.getCell(colIndex);
                if (Objects.isNull(cell))
                {
                    cell = row.createCell(colIndex);
                }
                cell.setCellValue(value);
            }
            else
            {
                Sheet sheet = workbook.getSheetAt(sheetIx);
                Row row = sheet.getRow(rowIndex);
                if (Objects.isNull(row))
                {
                    row = sheet.createRow(rowIndex);
                }
                Cell cell = row.getCell(colIndex);
                if (Objects.isNull(cell))
                {
                    cell = row.createCell(colIndex);
                }
                cell.setCellValue(value);
            }
            return true;
        }
        catch (Exception e)
        {
            return false;
        }
    }
    
    /**
     * 返回 row 和 column 位置的单元格值
     *
     * @param sheetIx  指定 Sheet 页,从 0 开始
     * @param rowIndex 指定行,从0开始
     * @param colIndex 指定列,从0开始
     */
    public String getValueAt(int sheetIx, int rowIndex, int colIndex)
    {
        if (isXlsx)
        {
            XSSFSheet sheet = ((SXSSFWorkbook) workbook).getXSSFWorkbook().getSheetAt(sheetIx);
            return getCellValueToString(sheet.getRow(rowIndex).getCell(colIndex));
        }
        else
        {
            Sheet sheet = workbook.getSheetAt(sheetIx);
            return getCellValueToString(sheet.getRow(rowIndex).getCell((short) colIndex));
        }
    }
    
    /**
     * 重置指定行的值
     *
     * @param rowData  数据
     * @param sheetIx  指定 Sheet 页,从 0 开始
     * @param rowIndex 指定行,从0开始
     */
    public boolean setRowValue(int sheetIx, List<String> rowData, int rowIndex)
    {
        try
        {
            if (isXlsx)
            {
                XSSFSheet sheet = ((SXSSFWorkbook) workbook).getXSSFWorkbook().getSheetAt(sheetIx);
                XSSFRow row = sheet.getRow(rowIndex);
                if (Objects.isNull(row))
                {
                    row = sheet.createRow(rowIndex);
                }
                for (int i = 0; i < rowData.size(); i++)
                {
                    XSSFCell cell = row.getCell(i);
                    if (Objects.isNull(cell))
                    {
                        cell = row.createCell(i);
                    }
                    cell.setCellValue(rowData.get(i));
                }
            }
            else
            {
                Sheet sheet = workbook.getSheetAt(sheetIx);
                Row row = sheet.getRow(rowIndex);
                if (Objects.isNull(row))
                {
                    row = sheet.createRow(rowIndex);
                }
                for (int i = 0; i < rowData.size(); i++)
                {
                    Cell cell = row.getCell(i);
                    if (Objects.isNull(cell))
                    {
                        cell = row.createCell(i);
                    }
                    cell.setCellValue(rowData.get(i));
                }
            }
            return true;
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return false;
        }
    }
    
    /**
     * 返回指定行的值的集合
     *
     * @param sheetIx  指定 Sheet 页,从 0 开始
     * @param rowIndex 指定行,从0开始
     */
    public List<String> getRowValue(int sheetIx, int rowIndex)
    {
        List<String> list = new ArrayList<>();
        
        if (isXlsx)
        {
            XSSFSheet sheet = ((SXSSFWorkbook) workbook).getXSSFWorkbook().getSheetAt(sheetIx);
            XSSFRow row = sheet.getRow(rowIndex);
            
            if (row == null)
            {
                list.add(null);
            }
            else
            {
                for (int i = 0; i < row.getLastCellNum(); i++)
                {
                    list.add(getCellValueToString(row.getCell(i)));
                }
            }
        }
        else
        {
            Sheet sheet = workbook.getSheetAt(sheetIx);
            Row row = sheet.getRow(rowIndex);
            
            if (row == null)
            {
                list.add(null);
            }
            else
            {
                for (int i = 0; i < row.getLastCellNum(); i++)
                {
                    list.add(getCellValueToString(row.getCell((short) i)));
                }
            }
        }
        
        return list;
    }
    
    /**
     * 返回列的值的集合
     *
     * @param sheetIx  指定 Sheet 页,从 0 开始
     * @param rowIndex 指定行,从0开始
     * @param colIndex 指定列,从0开始
     */
    public List<String> getColumnValue(int sheetIx, int rowIndex, int colIndex)
    {
        List<String> list = new ArrayList<>();
        if (isXlsx)
        {
            XSSFSheet sheet = ((SXSSFWorkbook) workbook).getXSSFWorkbook().getSheetAt(sheetIx);
            for (int i = rowIndex; i < getRowCount(sheetIx); i++)
            {
                XSSFRow row = sheet.getRow(i);
                if (row == null)
                {
                    list.add(null);
                    continue;
                }
                list.add(getCellValueToString(row.getCell(colIndex)));
            }
        }
        else
        {
            Sheet sheet = workbook.getSheetAt(sheetIx);
            for (int i = rowIndex; i < getRowCount(sheetIx); i++)
            {
                Row row = sheet.getRow(i);
                if (row == null)
                {
                    list.add(null);
                    continue;
                }
                list.add(getCellValueToString(row.getCell(colIndex)));
            }
        }
        
        return list;
    }
    
    /**
     * 获取excel 中sheet 总页数
     */
    public int getSheetCount()
    {
        return workbook.getNumberOfSheets();
    }
    
    /**
     * @className PoiExcelUtil2
     * @describe 清除所有sheet页
     * @author 马广胜
     * @date 2021-5-26 15:49
     */
    public void createSheet()
    {
        workbook.createSheet();
    }
    
    /**
     * 设置sheet名称,长度为1-31,不能包含后面任一字符: :\ / ? * [ ]
     *
     * @param sheetIx 指定 Sheet 页,从 0 开始,//
     * @param name    名称
     */
    public boolean setSheetName(int sheetIx, String name)
    {
        try
        {
            workbook.setSheetName(sheetIx, name);
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return false;
        }
        return true;
    }
    
    /**
     * 获取sheet的索引,从0开始
     *
     * @param name sheet 名称
     * @return -1表示该未找到名称对应的sheet
     */
    public int getSheetIndex(String name)
    {
        return workbook.getSheetIndex(name);
    }
    
    /**
     * 删除指定sheet
     *
     * @param sheetIx 指定 Sheet 页,从 0 开始
     */
    public boolean removeSheetAt(int sheetIx)
    {
        try
        {
            workbook.removeSheetAt(sheetIx);
            return true;
        }
        catch (Exception e)
        {
            return false;
        }
    }
    
    /**
     * 删除指定sheet中行,改变该行之后行的索引
     *
     * @param sheetIx  指定 Sheet 页,从 0 开始
     * @param rowIndex 指定行,从0开始
     */
    public boolean removeRow(int sheetIx, int rowIndex)
    {
        try
        {
            //xlsx格式。
            if (isXlsx)
            {
                XSSFSheet sheet = ((SXSSFWorkbook) workbook).getXSSFWorkbook().getSheetAt(sheetIx);
                sheet.shiftRows(rowIndex + 1, getRowCount(sheetIx), -1);
            }
            //xls格式
            else
            {
                Sheet sheet = workbook.getSheetAt(sheetIx);
                sheet.shiftRows(rowIndex + 1, getRowCount(sheetIx), -1);
                Row row = sheet.getRow(getRowCount(sheetIx) - 1);
                sheet.removeRow(row);
            }
            
            return true;
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return false;
        }
    }
    
    public Workbook getWorkbook()
    {
        return workbook;
    }
    
    /**
     * 关闭流
     */
    public void close() throws IOException
    {
        OutputStream os = new FileOutputStream(file);
        workbook.write(os);
        os.flush();
        os.close();
    }
    
    /**
     * 转换单元格的类型为String 默认的 <br>
     * 默认的数据类型:CELL_TYPE_BLANK(3), CELL_TYPE_BOOLEAN(4),
     * CELL_TYPE_ERROR(5),CELL_TYPE_FORMULA(2), CELL_TYPE_NUMERIC(0),
     * CELL_TYPE_STRING(1)
     */
    private String getCellValueToString(XSSFCell cell)
    {
        String strCell = "";
        if (cell == null)
        {
            return null;
        }
        switch (cell.getCellType().name())
        {
            case "BOOLEAN":
                strCell = String.valueOf(cell.getBooleanCellValue());
                break;
            case "NUMERIC":
                if (DateUtil.isCellDateFormatted(cell))
                {
                    Date date = cell.getDateCellValue();
                    if (pattern != null)
                    {
                        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
                        strCell = sdf.format(date);
                    }
                    else
                    {
                        strCell = date.toString();
                    }
                    break;
                }
                // 不是日期格式,则防止当数字过长时以科学计数法显示
//                cell.setCellType(Cell.CELL_TYPE_STRING);
                strCell = cell.toString();
                break;
            case "STRING":
                strCell = cell.getStringCellValue();
                break;
            default:
                break;
        }
        return strCell;
    }
    
    private String getCellValueToString(Cell cell)
    {
        String strCell = "";
        if (cell == null)
        {
            return null;
        }
        switch (cell.getCellType().name())
        {
            case "BOOLEAN":
                strCell = String.valueOf(cell.getBooleanCellValue());
                break;
            case "NUMERIC":
                if (DateUtil.isCellDateFormatted(cell))
                {
                    Date date = cell.getDateCellValue();
                    if (pattern != null)
                    {
                        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
                        strCell = sdf.format(date);
                    }
                    else
                    {
                        strCell = date.toString();
                    }
                    break;
                }
                // 不是日期格式,则防止当数字过长时以科学计数法显示
//                cell.setCellType(Cell.CELL_TYPE_STRING);
                strCell = cell.toString();
                break;
            case "STRING":
                strCell = cell.getStringCellValue();
                break;
            default:
                break;
        }
        return strCell;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我会为您提供一个简单的 Apache POI 工具类的使用示例。 首先,您需要在您的项目中引入 Apache POI 的依赖包,如果您使用 Maven,可以在 `pom.xml` 文件中添加以下代码: ```xml <dependencies> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.17</version> </dependency> </dependencies> ``` 接下来,我们可以创建一个简单的 Java 类来演示如何使用 Apache POI。 ```java import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ExcelWriter { public static void main(String[] args) { XSSFWorkbook workbook = new XSSFWorkbook(); XSSFSheet sheet = workbook.createSheet("Sheet1"); // 创建第一行并填写数据 Row row = sheet.createRow(0); Cell cell1 = row.createCell(0); cell1.setCellValue("姓名"); Cell cell2 = row.createCell(1); cell2.setCellValue("年龄"); // 创建第二行并填写数据 Row row2 = sheet.createRow(1); Cell cell3 = row2.createCell(0); cell3.setCellValue("张三"); Cell cell4 = row2.createCell(1); cell4.setCellValue(20); // 将数据写入 Excel 文件 try { FileOutputStream outputStream = new FileOutputStream(new File("output.xlsx")); workbook.write(outputStream); workbook.close(); outputStream.close(); System.out.println("数据写入成功"); } catch (IOException e) { e.printStackTrace(); } } } ``` 以上代码将创建一个名为 `Sheet1` 的 Excel 表格,并在第一行填写了 `姓名` 和 `年龄` 字段,第二行填写了 `张三` 和 `20` 的数据。最后将数据写入名为 `output.xlsx` 的 Excel 文件中。 希望这个简单的示例能够帮助您了解 Apache POI 的使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

树上灵溪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值