poi工具类
发布日期:2021-06-30 16:29:09
浏览次数:2
分类:技术文章
本文共 17605 字,大约阅读时间需要 58 分钟。
import java.io.FileNotFoundException;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 org.apache.poi.hssf.usermodel.HSSFCell;import org.apache.poi.hssf.usermodel.HSSFDateUtil;import org.apache.poi.hssf.usermodel.HSSFWorkbook;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.Font;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.util.CellRangeAddress;import org.apache.poi.xssf.usermodel.XSSFWorkbook;/** * * Excel 工具类 * * @author zhangyi * @version 1.0 2016/01/27 * */public class ExcelUtil { private Workbook workbook; private OutputStream os; private String pattern; // 日期格式 public void setPattern(String pattern) { this.pattern = pattern; } public ExcelUtil(Workbook workboook) { this.workbook = workboook; } public ExcelUtil(InputStream is, String version) throws FileNotFoundException, IOException { if ("2003".equals(version)) { workbook = new HSSFWorkbook(is); } else { workbook = new XSSFWorkbook(is); } } public String toString() { return "共有 " + getSheetCount() + "个sheet 页!"; } public String toString(int sheetIx) throws IOException { return "第 " + (sheetIx + 1) + "个sheet 页,名称: " + getSheetName(sheetIx) + ",共 " + getRowCount(sheetIx) + "行!"; } /** * * 根据后缀判断是否为 Excel 文件,后缀匹配xls和xlsx * * @param pathname * @return * */ public static boolean isExcel(String pathname) { if (pathname == null) { return false; } return pathname.endsWith(".xls") || pathname.endsWith(".xlsx"); } /** * * 读取 Excel 第一页所有数据 * * @return * @throws Exception * */ public List < List < String >> read() throws Exception { return read(0, 0, getRowCount(0) - 1); } /** * * 读取指定sheet 页所有数据 * * @param sheetIx * 指定 sheet 页,从 0 开始 * @return * @throws Exception */ public List < List < String >> read(int sheetIx) throws Exception { return read(sheetIx, 0, getRowCount(sheetIx) - 1); } /** * * 读取指定sheet 页指定行数据 * * @param sheetIx * 指定 sheet 页,从 0 开始 * @param start * 指定开始行,从 0 开始 * @param end * 指定结束行,从 0 开始 * @return * @throws Exception */ public List < List < String >> read(int sheetIx, int start, int end) throws Exception { Sheet sheet = workbook.getSheetAt(sheetIx); List < List < String >> list = new ArrayList < List < String >> (); if (end > getRowCount(sheetIx)) { end = getRowCount(sheetIx); } int cols = sheet.getRow(0).getLastCellNum(); // 第一行总列数 for (int i = start; i <= end; i++) { List < String > rowList = new ArrayList < String > (); 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; } /** * * 将数据写入到 Excel 默认第一页中,从第1行开始写入 * * @param rowData * 数据 * @return * @throws IOException * */ public boolean write(List < List < String >> rowData) throws IOException { return write(0, rowData, 0); } /** * * 将数据写入到 Excel 新创建的 Sheet 页 * * @param rowData * 数据 * @param sheetName * 长度为1-31,不能包含后面任一字符: :\ / ? * [ ] * @return * @throws IOException */ public boolean write(List < List < String >> rowData, String sheetName, boolean isNewSheet) throws IOException { Sheet sheet = null; if (isNewSheet) { sheet = workbook.createSheet(sheetName); } else { sheet = workbook.createSheet(); } int sheetIx = workbook.getSheetIndex(sheet); return write(sheetIx, rowData, 0); } /** * * 将数据追加到sheet页最后 * * @param rowData * 数据 * @param sheetIx * 指定 Sheet 页,从 0 开始 * @param isAppend * 是否追加,true 追加,false 重置sheet再添加 * @return * @throws IOException */ public boolean write(int sheetIx, List < List < String >> rowData, boolean isAppend) throws IOException { if (isAppend) { return write(sheetIx, rowData, getRowCount(sheetIx)); } else { // 清空再添加 clearSheet(sheetIx); return write(sheetIx, rowData, 0); } } /** * * 将数据写入到 Excel 指定 Sheet 页指定开始行中,指定行后面数据向后移动 * * @param rowData * 数据 * @param sheetIx * 指定 Sheet 页,从 0 开始 * @param startRow * 指定开始行,从 0 开始 * @return * @throws IOException */ public boolean write(int sheetIx, List < List < String >> rowData, int startRow) throws IOException { Sheet sheet = workbook.getSheetAt(sheetIx); int dataSize = rowData.size(); if (getRowCount(sheetIx) > 0) { // 如果小于等于0,则一行都不存在 sheet.shiftRows(startRow, getRowCount(sheetIx), dataSize); } 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) + ""); } } return true; } /** * * 设置cell 样式 * * @param sheetIx * 指定 Sheet 页,从 0 开始 * @param colIndex * 指定列,从 0 开始 * @return * @throws IOException */ public boolean setStyle(int sheetIx, int rowIndex, int colIndex, CellStyle style) throws IOException { Sheet sheet = workbook.getSheetAt(sheetIx); // sheet.autoSizeColumn(colIndex, true);// 设置列宽度自适应 sheet.setColumnWidth(colIndex, 4000); Cell cell = sheet.getRow(rowIndex).getCell(colIndex); cell.setCellStyle(style); return true; } /** * * 设置样式 * * @param type * 1:标题 2:第一行 * @return */ public CellStyle makeStyle(int type) { CellStyle style = workbook.createCellStyle(); DataFormat format = workbook.createDataFormat(); style.setDataFormat(format.getFormat("@")); // // 内容样式 设置单元格内容格式是文本 style.setAlignment(CellStyle.ALIGN_CENTER); // 内容居中 // style.setBorderTop(CellStyle.BORDER_THIN);// 边框样式 // style.setBorderRight(CellStyle.BORDER_THIN); // style.setBorderBottom(CellStyle.BORDER_THIN); // style.setBorderLeft(CellStyle.BORDER_THIN); Font font = workbook.createFont(); // 文字样式 if (type == 1) { // style.setFillForegroundColor(HSSFColor.LIGHT_BLUE.index);//颜色样式 // 前景颜色 // style.setFillBackgroundColor(HSSFColor.LIGHT_BLUE.index);//背景色 // style.setFillPattern(CellStyle.ALIGN_FILL);// 填充方式 font.setBold(true); font.setFontHeight((short) 500); } if (type == 2) { font.setBold(true); font.setFontHeight((short) 300); } style.setFont(font); return style; } /** * * 合并单元格 * * @param sheetIx * 指定 Sheet 页,从 0 开始 * @param firstRow * 开始行 * @param lastRow * 结束行 * @param firstCol * 开始列 * @param lastCol * 结束列 */ public void region(int sheetIx, int firstRow, int lastRow, int firstCol, int lastCol) { Sheet sheet = workbook.getSheetAt(sheetIx); sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, firstCol, lastCol)); } /** * * 指定行是否为空 * * @param sheetIx * 指定 Sheet 页,从 0 开始 * @param rowIndex * 指定开始行,从 0 开始 * @return true 不为空,false 不行为空 * @throws IOException */ public boolean isRowNull(int sheetIx, int rowIndex) throws IOException { Sheet sheet = workbook.getSheetAt(sheetIx); return sheet.getRow(rowIndex) == null; } /** * * 创建行,若行存在,则清空 * * @param sheetIx * 指定 sheet 页,从 0 开始 * @param rownum * 指定创建行,从 0 开始 * @return * @throws IOException */ public boolean createRow(int sheetIx, int rowIndex) throws IOException { Sheet sheet = workbook.getSheetAt(sheetIx); sheet.createRow(rowIndex); return true; } /** * * 指定单元格是否为空 * * @param sheetIx * 指定 Sheet 页,从 0 开始 * @param rowIndex * 指定开始行,从 0 开始 * @param colIndex * 指定开始列,从 0 开始 * @return true 行不为空,false 行为空 * @throws IOException */ public boolean isCellNull(int sheetIx, int rowIndex, int colIndex) throws IOException { Sheet sheet = workbook.getSheetAt(sheetIx); if (!isRowNull(sheetIx, rowIndex)) { return false; } Row row = sheet.getRow(rowIndex); return row.getCell(colIndex) == null; } /** * * 创建单元格 * * @param sheetIx * 指定 sheet 页,从 0 开始 * @param rowIndex * 指定行,从 0 开始 * @param colIndex * 指定创建列,从 0 开始 * @return true 列为空,false 行不为空 * @throws IOException */ public boolean createCell(int sheetIx, int rowIndex, int colIndex) throws IOException { Sheet sheet = workbook.getSheetAt(sheetIx); Row row = sheet.getRow(rowIndex); row.createCell(colIndex); return true; } /** * 返回sheet 中的行数 * * * @param sheetIx * 指定 Sheet 页,从 0 开始 * @return */ public int getRowCount(int sheetIx) { Sheet sheet = workbook.getSheetAt(sheetIx); if (sheet.getPhysicalNumberOfRows() == 0) { return 0; } return sheet.getLastRowNum() + 1; } /** * * 返回所在行的列数 * * @param sheetIx * 指定 Sheet 页,从 0 开始 * @param rowIndex * 指定行,从0开始 * @return 返回-1 表示所在行为空 */ public int getColumnCount(int sheetIx, int rowIndex) { 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 * 值 * @return * @throws IOException */ public boolean setValueAt(int sheetIx, int rowIndex, int colIndex, String value) throws IOException { Sheet sheet = workbook.getSheetAt(sheetIx); sheet.getRow(rowIndex).getCell(colIndex).setCellValue(value); return true; } /** * * 返回 row 和 column 位置的单元格值 * * @param sheetIx * 指定 Sheet 页,从 0 开始 * @param rowIndex * 指定行,从0开始 * @param colIndex * 指定列,从0开始 * @return * */ public String getValueAt(int sheetIx, int rowIndex, int colIndex) { Sheet sheet = workbook.getSheetAt(sheetIx); return getCellValueToString(sheet.getRow(rowIndex).getCell(colIndex)); } /** * * 重置指定行的值 * * @param rowData * 数据 * @param sheetIx * 指定 Sheet 页,从 0 开始 * @param rowIndex * 指定行,从0开始 * @return * @throws IOException */ public boolean setRowValue(int sheetIx, List < String > rowData, int rowIndex) throws IOException { Sheet sheet = workbook.getSheetAt(sheetIx); Row row = sheet.getRow(rowIndex); for (int i = 0; i < rowData.size(); i++) { row.getCell(i).setCellValue(rowData.get(i)); } return true; } /** * * 返回指定行的值的集合 * * @param sheetIx * 指定 Sheet 页,从 0 开始 * @param rowIndex * 指定行,从0开始 * @return */ public List < String > getRowValue(int sheetIx, int rowIndex) { Sheet sheet = workbook.getSheetAt(sheetIx); Row row = sheet.getRow(rowIndex); List < String > list = new ArrayList < String > (); if (row == null) { list.add(null); } else { for (int i = 0; i < row.getLastCellNum(); i++) { list.add(getCellValueToString(row.getCell(i))); } } return list; } /** * * 返回列的值的集合 * * @param sheetIx * 指定 Sheet 页,从 0 开始 * @param rowIndex * 指定行,从0开始 * @param colIndex * 指定列,从0开始 * @return */ public List < String > getColumnValue(int sheetIx, int rowIndex, int colIndex) { Sheet sheet = workbook.getSheetAt(sheetIx); List < String > list = new ArrayList < String > (); for (int i = rowIndex; i < getRowCount(sheetIx); i++) { Row row = sheet.getRow(i); if (row == null) { list.add(null); continue; } list.add(getCellValueToString(sheet.getRow(i).getCell(colIndex))); } return list; } /** * * 获取excel 中sheet 总页数 * * @return */ public int getSheetCount() { return workbook.getNumberOfSheets(); } public void createSheet() { workbook.createSheet(); } /** * * 设置sheet名称,长度为1-31,不能包含后面任一字符: :\ / ? * [ ] * * @param sheetIx * 指定 Sheet 页,从 0 开始,// * @param name * @return * @throws IOException */ public boolean setSheetName(int sheetIx, String name) throws IOException { workbook.setSheetName(sheetIx, name); return true; } /** * * 获取 sheet名称 * * @param sheetIx * 指定 Sheet 页,从 0 开始 * @return * @throws IOException */ public String getSheetName(int sheetIx) throws IOException { Sheet sheet = workbook.getSheetAt(sheetIx); return sheet.getSheetName(); } /** * 获取sheet的索引,从0开始 * * @param name * sheet 名称 * @return -1表示该未找到名称对应的sheet */ public int getSheetIndex(String name) { return workbook.getSheetIndex(name); } /** * * 删除指定sheet * * @param sheetIx * 指定 Sheet 页,从 0 开始 * @return * @throws IOException */ public boolean removeSheetAt(int sheetIx) throws IOException { workbook.removeSheetAt(sheetIx); return true; } /** * * 删除指定sheet中行,改变该行之后行的索引 * * @param sheetIx * 指定 Sheet 页,从 0 开始 * @param rowIndex * 指定行,从0开始 * @return * @throws IOException */ public boolean removeRow(int sheetIx, int rowIndex) throws IOException { Sheet sheet = workbook.getSheetAt(sheetIx); sheet.shiftRows(rowIndex + 1, getRowCount(sheetIx), -1); Row row = sheet.getRow(getRowCount(sheetIx) - 1); sheet.removeRow(row); return true; } /** * * 设置sheet 页的索引 * * @param sheetname * Sheet 名称 * @param pos * Sheet 索引,从0开始 */ public void setSheetOrder(String sheetname, int sheetIx) { workbook.setSheetOrder(sheetname, sheetIx); } /** * * 清空指定sheet页(先删除后添加并指定sheetIx) * * @param sheetIx * 指定 Sheet 页,从 0 开始 * @return * @throws IOException */ public boolean clearSheet(int sheetIx) throws IOException { String sheetname = getSheetName(sheetIx); removeSheetAt(sheetIx); workbook.createSheet(sheetname); setSheetOrder(sheetname, sheetIx); return true; } public Workbook getWorkbook() { return workbook; } /** * * 关闭流 * * @throws IOException */ public void close() throws IOException { if (os != null) { os.close(); } workbook.close(); } /** * * 转换单元格的类型为String 默认的 * 默认的数据类型:CELL_TYPE_BLANK(3), CELL_TYPE_BOOLEAN(4), * CELL_TYPE_ERROR(5),CELL_TYPE_FORMULA(2), CELL_TYPE_NUMERIC(0), * CELL_TYPE_STRING(1) * * @param cell * @return * */ private String getCellValueToString(Cell cell) { String strCell = ""; if (cell == null) { return null; } switch (cell.getCellType()) { case Cell.CELL_TYPE_BOOLEAN: strCell = String.valueOf(cell.getBooleanCellValue()); break; case Cell.CELL_TYPE_NUMERIC: if (HSSFDateUtil.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(HSSFCell.CELL_TYPE_STRING); strCell = cell.toString(); break; case Cell.CELL_TYPE_STRING: strCell = cell.getStringCellValue(); break; default: break; } return strCell; }}
转载地址:https://kevin.blog.csdn.net/article/details/78735661 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月07日 05时29分55秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
flask入门学习之第一个程序及装饰器回顾
2019-05-01
flask整理之 flask程序中的debug模式
2019-05-01
如何和大妈解释区块链,让他们理解区块链
2019-05-01
比特币要出现夭折?或许会出现转折
2019-05-01
比特币,山寨币,到底谁占有主导地位
2019-05-01
比特币,父母这一辈能接受吗?
2019-05-01
解释区块链钱包的意思
2019-05-01
让老百姓知道什么是比特币,只需要10分钟
2019-05-01
为什么要反对比特币,这不代表是空气币
2019-05-01
5G技术如何运用在数字资产方面
2019-05-01
区块链技术运用最广泛的还是保险
2019-05-01
新冠疫情影响了经济,却带动了区块链
2019-05-01
我们提出了DeFi项目如何成为聚合器,有两种路径
2019-05-01
SnapEx的新感觉,对新手很友好
2019-05-01
区块链有哪些潜在风险?
2019-05-01
聚合器运用在什么地方最合适
2019-05-01
区块链可以解决供应链的问题,包括食品方面
2019-05-01
首个聚合器怎么产生的,并运用领域在什么
2019-05-01
区块链资金安全吗?该怎么保护
2019-05-01
区块链的优势和劣势的对比
2019-05-01