poi读写Excel文件
- 格式:doc
- 大小:66.50 KB
- 文档页数:14
poi根据excel模板文件导出数据Poi是一款用于操作Microsoft Office文件(如Excel、Word和PowerPoint)的Java库。
它提供了丰富的API,使开发人员可以读取、创建和修改这些文件。
在本文中,我们将讨论如何使用Poi库根据Excel 模板文件导出数据。
首先,我们需要在项目中导入Poi库的依赖项。
你可以在Maven或Gradle中添加以下依赖项:Maven:```xml<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency>```Gradle:```implementation 'org.apache.poi:poi:4.1.2'implementation 'org.apache.poi:poi-ooxml:4.1.2'```接下来,我们需要加载Excel模板文件。
假设我们有一个名为"template.xlsx"的Excel模板文件,其中包含我们想要导出数据的工作表。
我们可以通过以下代码加载模板文件:```javaFileInputStream fis = new FileInputStream("template.xlsx");Workbook workbook = new XSSFWorkbook(fis);Sheet sheet = workbook.getSheetAt(0); // 假设我们要操作的是第一个工作表```现在我们已经加载了模板文件,接下来我们需要根据Excel模板填充数据。
POI向Excel中写⼊数据及追加数据import ermodel.XSSFCell;import ermodel.XSSFRow;import ermodel.XSSFSheet;import ermodel.XSSFWorkbook;import java.io.*;import java.util.ArrayList;import java.util.List;public class WriteExcel {/*** 向Excel中写⼊数据* @param args* @throws Exception*/public static void main(String[] args) throws Exception {List<Student> stuList = new ArrayList<Student>();stuList.add(new Student(12,"lili","深圳南⼭"));stuList.add(new Student(13,"liming","深圳宝安"));stuList.add(new Student(14,"chengming","深圳罗湖"));String filePath = "E:\\ExcelData.xlsx";boolean flag = fileExist(filePath);if (flag){writeExcel(stuList,filePath);}else {File file = new File(filePath);writeExcel(stuList,filePath);}}//判断⽂件是否存在public static boolean fileExist(String filePath){boolean flag = false;File file = new File(filePath);flag = file.exists();return flag;}//向Excel中写数据public static void writeExcel(List<Student> list ,String filePath){XSSFWorkbook workbook = new XSSFWorkbook();XSSFSheet sheet = workbook.createSheet("student");XSSFRow firstRow = sheet.createRow(0);//第⼀⾏表头XSSFCell cells[] = new XSSFCell[3];String[] titles = new String[]{"age","name","address"};//循环设置表头信息for (int i=0;i<3;i++){cells[0]=firstRow.createCell(i);cells[0].setCellValue(titles[i]);}//遍历list,将数据写⼊Excel中for (int i=0;i<list.size();i++){XSSFRow row = sheet.createRow(i+1);Student student = list.get(i);XSSFCell cell = row.createCell(0); //第⼀列cell.setCellValue(student.getAge());cell=row.createCell(1); //第⼆列cell.setCellValue(student.getName());cell=row.createCell(2); //第三列cell.setCellValue(student.getAddress());}OutputStream out = null;try {out = new FileOutputStream(filePath);workbook.write(out);out.close();} catch (Exception e){e.printStackTrace();}}}效果:⼆、向Excel中追加数据import ermodel.XSSFCell;import ermodel.XSSFRow;import ermodel.XSSFSheet;import ermodel.XSSFWorkbook;import java.io.FileInputStream;import java.io.FileOutputStream;import java.util.ArrayList;import java.util.List;public class AddExcel {/*** 向Excel中追加内容* @param args* @throws Exception*/public static void main(String[] args) throws Exception{List<Student> stuList2 = new ArrayList<Student>();stuList2.add(new Student(15,"⼩明","深圳南⼭"));stuList2.add(new Student(16,"⼩王","深圳宝安"));stuList2.add(new Student(17,"⼩张","深圳罗湖"));FileInputStream in = new FileInputStream("E:\\ExcelData.xlsx");XSSFWorkbook workbook = new XSSFWorkbook(in);XSSFSheet sheet = workbook.getSheetAt(0);XSSFRow row=sheet.getRow(1);FileOutputStream out = new FileOutputStream("E:\\ExcelData.xlsx");//从第⼆⾏开始追加列/*row=sheet.getRow(1);row.createCell(3).setCellValue("AAA");row.createCell(4).setCellValue("BBB");*///追加列数据for(int i=0;i<stuList2.size();i++){Student student = stuList2.get(i);row = sheet.getRow(i+1);row.createCell(3).setCellValue(student.getAge());row.createCell(4).setCellValue(student.getName());row.createCell(5).setCellValue(student.getAddress());}/*//追加⾏数据row=sheet.createRow((short)(sheet.getLastRowNum()+1)); //在现有⾏号后追加数据 row.createCell(0).setCellValue("测试数据"); //设置第⼀个(从0开始)单元格的数据 row.createCell(1).setCellValue("haha"); //设置第⼆个(从0开始)单元格的数据*/ try {out.flush();workbook.write(out);out.close();}catch (Exception e){e.printStackTrace();}}}效果:。
POI操作常用方法一、POI简介Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
二、HSSF概况HSSF 是Horrible SpreadSheet Format的缩写,通过HSSF,你可以用纯Java代码来读取、写入、修改Excel文件。
HSSF 为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”。
三、POI EXCEL文档结构类HSSFWorkbook excel文档对象HSSFSheet excel的sheet HSSFRow excel的行HSSFCell excel的单元格HSSFFont excel字体HSSFName 名称HSSFDataFormat 日期格式HSSFHeader sheet头HSSFFooter sheet尾HSSFCellStyle cell样式HSSFDateUtil 日期HSSFPrintSetup 打印HSSFErrorConstants 错误信息表四、EXCEL常用操作方法1、得到Excel常用对象Java代码1.POIFSFileSystem fs=newPOIFSFileSystem(new FileInputStream("d:/test.xls"));2.//得到Excel工作簿对象3.HSSFWorkbook wb=new HSSFWorkbook(fs);4.//得到Excel工作表对象5.HSSFSheet sheet=wb.getSheetAt(0);6.//得到Excel工作表的行7.HSSFRow row=sheet.getRow(i);8.//得到Excel工作表指定行的单元格9.HSSFCell cell=row.getCell((short)j);10.cellStyle=cell.getCellStyle();//得到单元格样式11.POIFSFileSystem fs=newPOIFSFileSystem(new FileInputStream("d:/test.xls"));12.//得到Excel工作簿对象13.HSSFWorkbook wb=new HSSFWorkbook(fs);14.//得到Excel工作表对象15.HSSFSheet sheet=wb.getSheetAt(0);16.//得到Excel工作表的行17.HSSFRow row=sheet.getRow(i);18.//得到Excel工作表指定行的单元格19.HSSFCell cell=row.getCell((short)j);20.cellStyle=cell.getCellStyle();//得到单元格样式2、建立Excel常用对象Java代码1.HSSFWorkbook wb=new HSSFWorkbook();//创建Excel工作簿对象2.HSSFSheet sheet=wb.createSheet("new sheet");//创建Excel 工作表对象3.HSSFRow row=sheet.createRow((short)0);//创建Excel工作表的行4.cellStyle=wb.createCellStyle();//创建单元格样式5.row.createCell((short)0).setCellStyle(cellStyle);//创建Excel 工作表指定行的单元格6.row.createCell((short)0).setCellValue(1);//设置Excel工作表的值7.HSSFWorkbook wb=new HSSFWorkbook();//创建Excel工作簿对象8.HSSFSheet sheet=wb.createSheet("new sheet");//创建Excel 工作表对象9.HSSFRow row=sheet.createRow((short)0);//创建Excel工作表的行10.cellStyle=wb.createCellStyle();//创建单元格样式11.row.createCell((short)0).setCellStyle(cellStyle);//创建Excel 工作表指定行的单元格12.row.createCell((short)0).setCellValue(1);//设置Excel工作表的值3、设置sheet名称和单元格容Java代码1.wb.setSheetName(1,"第一工作表",HSSFCell.ENCODING_UTF_16);2.cell.setEncoding((short)1);3.cell.setCellValue("单元格容");4.wb.setSheetName(1,"第一工作表",HSSFCell.ENCODING_UTF_16);5.cell.setEncoding((short)1);6.cell.setCellValue("单元格容");4、取得sheet的数目Java代码1.wb.getNumberOfSheets()2.wb.getNumberOfSheets()5、根据index取得sheet对象Java代码1.HSSFSheet sheet=wb.getSheetAt(0);2.HSSFSheet sheet=wb.getSheetAt(0);6、取得有效的行数Java代码1.int rowcount=sheet.getLastRowNum();2.int rowcount=sheet.getLastRowNum();7、取得一行的有效单元格个数Java代码1.row.getLastCellNum();2.row.getLastCellNum();8、单元格值类型读写Java代码1.cell.setCellType(HSSFCell.CELL_TYPE_STRING);//设置单元格为STRING类型2.cell.getNumericCellValue();//读取为数值类型的单元格容3.cell.setCellType(HSSFCell.CELL_TYPE_STRING);//设置单元格为STRING类型4.cell.getNumericCellValue();//读取为数值类型的单元格容9、设置列宽、行高Java代码1.sheet.setColumnWidth((short)column,(short)width);2.row.setHeight((short)height);3.sheet.setColumnWidth((short)column,(short)width);4.row.setHeight((short)height);10、添加区域,合并单元格Java代码1.Region region=new Region((short)rowFrom,(short)columnFrom,(short)rowT o2.,(short)columnT o);//合并从第rowFrom行columnFrom列3.sheet.addMergedRegion(region);//到rowTo行columnTo的区域4.//得到所有区域5.sheet.getNumMergedRegions()6.Region region=newRegion((short)rowFrom,(short)columnFrom,(short)rowT o7.,(short)columnT o);//合并从第rowFrom行columnFrom列8.sheet.addMergedRegion(region);//到rowTo行columnTo的区域9.//得到所有区域10.sheet.getNumMergedRegions()11、保存Excel文件Java代码1.FileOutputStream fileOut=new FileOutputStream(path);2.wb.write(fileOut);3.FileOutputStream fileOut=new FileOutputStream(path);4.wb.write(fileOut);12、根据单元格不同属性返回字符串数值Java代码1.public String getCellStringValue(HSSFCell cell){2.String cellValue="";3.switch(cell.getCellType()){4.case HSSFCell.CELL_TYPE_STRING://字符串类型5.cellValue=cell.getStringCellValue();6.if(cellValue.trim().equals("")||cellValue.trim().length()<=0)7.cellValue="";8.break;9.case HSSFCell.CELL_TYPE_NUMERIC://数值类型10.cellValue=String.valueOf(cell.getNumericCellValue());11.break;12.case HSSFCell.CELL_TYPE_FORMULA://公式13.cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);14.cellValue=String.valueOf(cell.getNumericCellValue());15.break;16.case HSSFCell.CELL_TYPE_BLANK:17.cellValue="";18.break;19.case HSSFCell.CELL_TYPE_BOOLEAN:20.break;21.case HSSFCell.CELL_TYPE_ERROR:22.break;23.default:24.break;25.}26.return cellValue;27.}28.public String getCellStringValue(HSSFCell cell){29.String cellValue="";30.switch(cell.getCellType()){31.case HSSFCell.CELL_TYPE_STRING://字符串类型32.cellValue=cell.getStringCellValue();33.if(cellValue.trim().equals("")||cellValue.trim().length()<=0)34.cellValue="";35.break;36.case HSSFCell.CELL_TYPE_NUMERIC://数值类型37.cellValue=String.valueOf(cell.getNumericCellValue());38.break;39.case HSSFCell.CELL_TYPE_FORMULA://公式40.cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);41.cellValue=String.valueOf(cell.getNumericCellValue());42.break;43.case HSSFCell.CELL_TYPE_BLANK:44.cellValue="";45.break;46.case HSSFCell.CELL_TYPE_BOOLEAN:47.break;48.case HSSFCell.CELL_TYPE_ERROR:49.break;50.default:51.break;52.}53.return cellValue;54.}13、常用单元格边框格式Java代码1.HSSFCellStyle style=wb.createCellStyle();2.style.setBorderBottom(HSSFCellStyle.BORDER_DOTTED);//下边框3.style.setBorderLeft(HSSFCellStyle.BORDER_DOTTED);//左边框4.style.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框5.style.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框6.HSSFCellStyle style=wb.createCellStyle();7.style.setBorderBottom(HSSFCellStyle.BORDER_DOTTED);//下边框8.style.setBorderLeft(HSSFCellStyle.BORDER_DOTTED);//左边框9.style.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框10.style.setBorderT op(HSSFCellStyle.BORDER_THIN);//上边框14、设置字体和容位置Java代码1.HSSFFont f=wb.createFont();2. f.setFontHeightInPoints((short)11);//字号3. f.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);//加粗4.style.setFont(f);5.style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//左右居中6.style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTE R);//上下居中7.style.setRotation(short rotation);//单元格容的旋转的角度8.HSSFDataFormat df=wb.createDataFormat();9.style1.setDataFormat(df.getFormat("0.00%"));//设置单元格数据格式10.cell.setCellFormula(string);//给单元格设公式11.style.setRotation(short rotation);//单元格容的旋转的角度12.HSSFFont f=wb.createFont();13. f.setFontHeightInPoints((short)11);//字号14. f.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);//加粗15.style.setFont(f);16.style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//左右居中17.style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENT ER);//上下居中18.style.setRotation(short rotation);//单元格容的旋转的角度19.HSSFDataFormat df=wb.createDataFormat();20.style1.setDataFormat(df.getFormat("0.00%"));//设置单元格数据格式21.cell.setCellFormula(string);//给单元格设公式22.style.setRotation(short rotation);//单元格容的旋转的角度15、插入图片Java代码1.//先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray2.ByteArrayOutputStream byteArrayOut=new ByteArrayOutputStream();3.BufferedImage bufferImg=ImageIO.read(new File("ok.jpg"));4.ImageIO.write(bufferImg,"jpg",byteArrayOut);5.//读进一个excel模版6.FileInputStream fos=new FileInputStream(filePathName+"/stencil.xlt");7.fs=new POIFSFileSystem(fos);8.//创建一个工作薄9.HSSFWorkbook wb=new HSSFWorkbook(fs);10.HSSFSheet sheet=wb.getSheetAt(0);11.HSSFPatriarch patriarch=sheet.createDrawingPatriarch();12.HSSFClientAnchor anchor=new HSSFClientAnchor(0,0,1023,255,(short)0,0,(short)10,10);13.patriarch.createPicture(anchor,wb.addPicture(byteArrayO ut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG));14.//先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray15.ByteArrayOutputStream byteArrayOut=new ByteArrayOutputStream();16.BufferedImage bufferImg=ImageIO.read(new File("ok.jpg"));17.ImageIO.write(bufferImg,"jpg",byteArrayOut);18.//读进一个excel模版19.FileInputStream fos=new FileInputStream(filePathName+"/stencil.xlt");20.fs=new POIFSFileSystem(fos);21.//创建一个工作薄22.HSSFWorkbook wb=new HSSFWorkbook(fs);23.HSSFSheet sheet=wb.getSheetAt(0);24.HSSFPatriarch patriarch=sheet.createDrawingPatriarch();25.HSSFClientAnchor anchor=new HSSFClientAnchor(0,0,1023,255,(short)0,0,(short)10,10);26.patriarch.createPicture(anchor,wb.addPicture(byteArrayO ut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG));16、调整工作表位置Java代码1.HSSFWorkbook wb=new HSSFWorkbook();2.HSSFSheet sheet=wb.createSheet("format sheet");3.HSSFPrintSetup ps=sheet.getPrintSetup();4.sheet.setAutobreaks(true);5.ps.setFitHeight((short)1);6.ps.setFitWidth((short)1);7.HSSFWorkbook wb=new HSSFWorkbook();8.HSSFSheet sheet=wb.createSheet("format sheet");9.HSSFPrintSetup ps=sheet.getPrintSetup();10.sheet.setAutobreaks(true);11.ps.setFitHeight((short)1);12.ps.setFitWidth((short)1);17、设置打印区域Java代码1.HSSFSheet sheet=wb.createSheet("Sheet1");2.wb.setPrintArea(0,"$A$1:$C$2");3.HSSFSheet sheet=wb.createSheet("Sheet1");4.wb.setPrintArea(0,"$A$1:$C$2");18、标注脚注Java代码1.HSSFSheet sheet=wb.createSheet("format sheet");2.HSSFFooter footer=sheet.getFooter()3.footer.setRight("Page"+HSSFFooter.page()+"of"+HSSFFoo ter.numPages());4.HSSFSheet sheet=wb.createSheet("format sheet");5.HSSFFooter footer=sheet.getFooter()6.footer.setRight("Page"+HSSFFooter.page()+"of"+HSSFFoo ter.numPages());19、在工作单中清空行数据,调整行位置Java代码1.HSSFWorkbook wb=new HSSFWorkbook();2.HSSFSheet sheet=wb.createSheet("row sheet");3.//Create various cells and rows for spreadsheet.4.//Shift rows6-11on the spreadsheet to the top(rows0-5)5.sheet.shiftRows(5,10,-5);6.HSSFWorkbook wb=new HSSFWorkbook();7.HSSFSheet sheet=wb.createSheet("row sheet");8.//Create various cells and rows for spreadsheet.9.//Shift rows6-11on the spreadsheet to the top(rows0-5)10.sheet.shiftRows(5,10,-5);20、选中指定的工作表Java代码1.HSSFSheet sheet=wb.createSheet("row sheet");2.heet.setSelected(true);3.HSSFSheet sheet=wb.createSheet("row sheet");4.heet.setSelected(true);21、工作表的放大缩小Java代码1.HSSFSheet sheet1=wb.createSheet("new sheet");2.sheet1.setZoom(1,2);//50percent magnification3.HSSFSheet sheet1=wb.createSheet("new sheet");。
easy poi fe 用法【实用版】目录1.Easy POI 简介2.Easy POI 的功能3.Easy POI 的用法示例正文Easy POI 是一款基于 Apache POI 的 Java 库,用于处理Microsoft Office 文档,如 Excel、Word 和 PowerPoint 等。
它提供了简单易用的 API,使得开发人员可以轻松地操作这些文档。
Easy POI 的主要功能包括:- 读取和写入 Excel 文件:可以轻松地读取和写入 Excel 文件中的数据,包括单元格、行、列和工作表等。
- 读取和写入 Word 文件:可以读取和写入 Word 文件中的文本、图片、表格等元素。
- 读取和写入 PowerPoint 文件:可以读取和写入 PowerPoint 文件中的幻灯片、文本、图片等元素。
下面是一个简单的 Easy POI 用法示例,展示如何读取和写入 Excel 文件:1.首先,需要在项目中添加 Easy POI 的依赖。
如果使用 Maven,可以在 pom.xml 文件中添加以下依赖:```xml<dependency><groupId>com.alibaba</groupId><artifactId>easy-poi</artifactId><version>2.2.6</version></dependency>```2.导入 Easy POI 所需的类:```javaimport com.alibaba.excel.EasyExcel;import com.alibaba.excel.read.builder.ExcelReaderBuilder;import com.alibaba.excel.write.builder.ExcelWriterBuilder;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;```3.读取 Excel 文件:```javapublic static void readExcel(String filePath) {try (FileInputStream fis = new FileInputStream(newFile(filePath));ExcelReaderBuilder excelReaderBuilder = EasyExcel.read(fis).build()) {// 创建数据模型类,例如 UserUser user = new User();// 读取第一个工作表的数据excelReaderBuilder.sheet().doRead(user);// 输出读取到的数据System.out.println(user);} catch (IOException e) {e.printStackTrace();}}```4.写入 Excel 文件:```javapublic static void writeExcel(String filePath) {try (FileOutputStream fos = new FileOutputStream(new File(filePath));ExcelWriterBuilder excelWriterBuilder = EasyExcel.write(fos).build()) {// 创建数据模型类,例如 UserUser user = new User();user.setName("John");user.setAge(30);// 写入第一个工作表的数据excelWriterBuilder.sheet().doWrite(user);} catch (IOException e) {e.printStackTrace();}}```以上就是一个简单的 Easy POI 用法示例,展示了如何读取和写入Excel 文件。
java中poi解析Excel⽂件版本问题解决办法poi解析Excel⽂件版本问题解决办法poi解析Excel⽂件时有两种格式:HSSFWorkbook格式⽤来解析Excel2003(xls)的⽂件XSSFWorkbook格式⽤来解析Excel2007(xlsx)的⽂件如果⽤HSSFWorkbook解析Excel2007(xlsx)时就会报异常:“The supplied data appears to be in the Office 2007+ XML.You are calling the part of POI that deals with OLE2 Office Documents.You need to call a different part of POI to process this data (eg XSSF instead of HSSF)”因为HSSFWorkbook和XSSFWorkbook都实现了Workbook接⼝,所以我们可以⽤Workbook来解析两个版本的Excel。
代码如下:try{//将⽂件的输⼊流转换成WorkbookWorkbook wb = WorkbookFactory.create(numFile.getInputStream());//获得第⼀个⼯作表Sheet sheet = wb.getSheetAt(0);//获得第⼀⾏Row row = sheet.getRow(0);//获得第⼀⾏的第⼀列Cell cell = row.getCell(0);}catch (Exception e){e.printStackTrace();}以上就是poi解析Excel⽂件版本问题解决办法的详解,如有疑问请留⾔或者到本站社区交流讨论,谢谢⼤家对本站的⽀持!。
POI操作大全(动态合并单元格为单元格生成一个自定义的数据显示格式自定义公式计算结果生POI是一个用于操作Microsoft Office格式文件的Java库。
通过POI库,可以实现对Excel、Word和PowerPoint文件的读写操作。
本文将介绍POI库的一些常用操作,包括动态合并单元格、为单元格生成自定义的数据显示格式、自定义公式计算结果等。
一、动态合并单元格在Excel中,可以将多个相邻的单元格合并成一个单元格,以便显示更大的数据块。
POI库可以很方便地实现对合并单元格的操作。
1.创建合并区域:```javaCellRangeAddress region = new CellRangeAddress(rowStart, rowEnd, colStart, colEnd);sheet.addMergedRegion(region);```其中,rowStart和rowEnd表示合并区域的起始行和结束行,colStart和colEnd表示合并区域的起始列和结束列。
2.设置合并单元格的值:```javaCell cell = sheet.getRow(rowStart).createCell(colStart);cell.setCellValue("合并单元格的值");```这里,我们取合并区域的起始行和起始列,设置单元格的值。
二、为单元格生成一个自定义的数据显示格式在Excel中,可以对单元格的值设置格式,以便以不同的方式展示数据。
POI库提供了设置单元格格式的方法。
1.创建格式对象:```javaCellStyle cellStyle = workbook.createCellStyle(;```2.设置格式:```javaDataFormat dataFormat = workbook.createDataFormat(;short format = dataFormat.getFormat("自定义格式");cellStyle.setDataFormat(format);```其中,"自定义格式"是Excel中的一种格式化字符串。
Java开发⼩技巧(六):使⽤ApachePOI读取Excel前⾔在数据仓库中,ETL最基础的步骤就是从数据源抽取所需的数据,这⾥所说的数据源并⾮仅仅是指数据库,还包括excel、csv、xml等各种类型的数据接⼝⽂件,⽽这些⽂件中的数据不⼀定是结构化存储的,⽐如各种各样的报表⽂件,往往是⼀些复杂的表格结构,其中不仅有我们需要的数据,还有⼀些冗余的、⽆价值的数据,这时我们就⽆法直接⽤⼀般数据加载⼯具直接读取⼊库了。
也许你会想,数据源导出⽂件前先处理好数据就⾏了。
然⽽,实际开发中数据源往往是多个的,⽽且涉及到不同的部门甚⾄公司,这其间难免会出现各种⿇烦,甚⾄有些数据⽂件还是纯⼿⼯处理的,不⼀定能给到你满意的数据格式。
所以我们不讨论谁该负责转换的问题,这⾥主要介绍如何使⽤Apache POI来从Excel数据⽂件中读取我们想要的数据,以及⽤Bean Validation对数据内容按照预定的规则进⾏校验。
⽂章要点:Apache POI是什么如何使⽤Apache POI读取Excel⽂件使⽤Bean Validation进⾏数据校验Excel读取⼯具类使⽤实例Apache POI是什么Apache POI是⽤Java编写的免费开源的跨平台的Java API,提供API给Java程式对Microsoft Office格式档案进⾏读和写的操作。
如何使⽤Apache POI处理Excel⽂件1、导⼊Maven依赖<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><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>3.17</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>3.17</version></dependency>2、创建Workbook实例这⾥需要注意的是Excel⽂档的版本问题,Excel2003及以前版本的⽂档使⽤HSSFWorkbook对象,Excel2007及之后版本使⽤HSSFWorkbook对象// Excel2003及以前版本Workbook workbook = new XSSFWorkbook(new FileInputStream(path));// Excel2007及之后版本Workbook workbook = new HSSFWorkbook(new FileInputStream(path));3、获取Sheet表格页对象Sheet是Excel⽂档中的⼯作簿即表格页⾯,读取前要先找到数据所在页⾯,可以通过标签名或者索引的⽅式获取指定Sheet对象// 按索引获取Sheet sheet = workbook.getSheetAt(index);// 按标签名获取4、获取Cell单元格对象// ⾏索引row和列索引col都是以 0 起始Cell cell = sheet.getRow(row).getCell(col);5、获取单元格内容获取单元格的值之前⾸先要获知单元格内容的类型,在Excel中单元格有6种类型:1. CELL_TYPE_BLANK :空值2. CELL_TYPE_BOOLEAN :布尔型3. CELL_TYPE_ERROR :错误4. CELL_TYPE_FORMULA :公式型5. CELL_TYPE_STRING:字符串型6. CELL_TYPE_NUMERIC:数值型各种类型的内容还需要进⼀步判断其数据格式,例如单元格的Type为CELL_TYPE_NUMERIC时,它有可能是Date类型,在Excel中的Date 类型是以Double类型的数字存储的,不同类型的值要调⽤cell对象相应的⽅法去获取,具体情况具体分析public Object getCellValue(Cell cell) {if(cell == null) {return null;}switch (cell.getCellType()) {case Cell.CELL_TYPE_STRING:return cell.getRichStringCellValue().getString();case Cell.CELL_TYPE_NUMERIC:if (DateUtil.isCellDateFormatted(cell)) {return cell.getDateCellValue();} else {return cell.getNumericCellValue();}case Cell.CELL_TYPE_BOOLEAN:return cell.getBooleanCellValue();case Cell.CELL_TYPE_FORMULA:return formula.evaluate(cell).getNumberValue();default:return null;}}6、关闭Workbook对象workbook.close();使⽤Bean Validation进⾏数据校验当你要处理⼀个业务逻辑时,数据校验是你不得不考虑和⾯对的事情,程序必须通过某种⼿段来确保输⼊进来的数据从语义上来讲是正确的或者符合预定义的格式,⼀个Java程序⼀般是分层设计的,⽽不同的层可能是不同的开发⼈员来完成,这样就很容易出现不同的层重复进⾏数据验证逻辑,导致代码冗余等问题。
POI学习笔记1.POI结构与常用类(1)POI介绍Apache POI是Apache软件基金会的开源项目,POI提供API给Java程序对Microsoft Office 格式档案读和写的功能。
.NET的开发人员则可以利用NPOI (POI for .NET) 来存取 Microsoft Office 文档的功能。
2.(1)创建Workbook和Sheetpublicclass Test00{publicstaticvoid main(String[] args) throws IOException{String filePath="d:\\users\\lizw\\桌面\\POI\\sample.xls";//文件路径HSSFWorkbook workbook = new HSSFWorkbook();//创建Excel文件(Workbook)HSSFSheet sheet = workbook.createSheet();//创建工作表(Sheet)sheet = workbook.createSheet("Test");//创建工作表(Sheet)FileOutputStream out = new FileOutputStream(filePath);workbook.write(out);//保存Excel文件out.close();//关闭文件流System.out.println("OK!");}}(2)创建单元格HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)HSSFRow row = sheet.createRow(0);// 创建行,从0开始HSSFCell cell = row.createCell(0);// 创建行的单元格,也是从0开始cell.setCellValue("李志伟");// 设置单元格内容row.createCell(1).setCellValue(false);// 设置单元格内容,重载row.createCell(2).setCellValue(new Date());// 设置单元格内容,重载row.createCell(3).setCellValue(12.345);// 设置单元格内容,重载(3)创建文档摘要信息workbook.createInformationProperties();//创建文档信息DocumentSummaryInformationdsi= workbook.getDocumentSummaryInformation();//摘要信息dsi.setCategory("类别:Excel文件");//类别dsi.setManager("管理者:李志伟");//管理者dsi.setCompany("公司:--");//公司SummaryInformationsi = workbook.getSummaryInformation();//摘要信息si.setSubject("主题:--");//主题si.setTitle("标题:测试文档");//标题si.setAuthor("作者:李志伟");//作者si.setComments("备注:POI测试文档");//备注(4)创建批注HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)HSSFPatriarchpatr = sheet.createDrawingPatriarch();HSSFClientAnchor anchor = patr.createAnchor(0, 0, 0, 0, 5, 1, 8, 3);//创建批注位置HSSFComment comment = patr.createCellComment(anchor);//创建批注comment.setString(new HSSFRichTextString("这是一个批注段落!"));//设置批注内容comment.setAuthor("李志伟");//设置批注作者comment.setVisible(true);//设置批注默认显示HSSFCell cell = sheet.createRow(2).createCell(1);cell.setCellValue("测试");cell.setCellComment(comment);//把批注赋值给单元格创建批注位置HSSFPatriarch.createAnchor(dx1, dy1, dx2, dy2, col1, row1, col2, row2)方法参数说明:dx1 第1个单元格中x轴的偏移量dy1 第1个单元格中y轴的偏移量dx2 第2个单元格中x轴的偏移量dy2 第2个单元格中y轴的偏移量col1 第1个单元格的列号row1 第1个单元格的行号col2 第2个单元格的列号row2 第2个单元格的行号(5)创建页眉和页脚HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)HSSFHeader header =sheet.getHeader();//得到页眉header.setLeft("页眉左边");header.setRight("页眉右边");header.setCenter("页眉中间");HSSFFooter footer =sheet.getFooter();//得到页脚footer.setLeft("页脚左边");footer.setRight("页脚右边");footer.setCenter("页脚中间");也可以使用Office自带的标签定义,你可以通过HSSFHeader或HSSFFooter访问到它们,都是静态属性,列表如下:HSSFHeader.tab &A 表名HSSFHeader.file &F 文件名HSSFHeader.startBold &B 粗体开始HSSFHeader.endBold &B 粗体结束HSSFHeader.startUnderline &U 下划线开始HSSFHeader.endUnderline &U 下划线结束HSSFHeader.startDoubleUnderline &E 双下划线开始HSSFHeader.endDoubleUnderline &E 双下划线结束HSSFHeader.time &T 时间HSSFHeader.date &D 日期HSSFHeader.numPages &N 总页面数HSSFHeader.page &P 当前页号3.Excel的单元格操作(1)设置格式HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)HSSFRow row=sheet.createRow(0);//设置日期格式--使用Excel内嵌的格式HSSFCell cell=row.createCell(0);cell.setCellValue(new Date());HSSFCellStyle style=workbook.createCellStyle();style.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));cell.setCellStyle(style);//设置保留2位小数--使用Excel内嵌的格式cell=row.createCell(1);cell.setCellValue(12.3456789);style=workbook.createCellStyle();style.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00"));cell.setCellStyle(style);//设置货币格式--使用自定义的格式cell=row.createCell(2);cell.setCellValue(12345.6789);style=workbook.createCellStyle();style.setDataFormat(workbook.createDataFormat().getFormat("¥#,##0"));cell.setCellStyle(style);//设置百分比格式--使用自定义的格式cell=row.createCell(3);cell.setCellValue(0.123456789);style=workbook.createCellStyle();style.setDataFormat(workbook.createDataFormat().getFormat("0.00%"));cell.setCellStyle(style);//设置中文大写格式--使用自定义的格式cell=row.createCell(4);cell.setCellValue(12345);style=workbook.createCellStyle();style.setDataFormat(workbook.createDataFormat().getFormat("[DbNum2][$-804]0"));cell.setCellStyle(style);//设置科学计数法格式--使用自定义的格式cell=row.createCell(5);cell.setCellValue(12345);style=workbook.createCellStyle();style.setDataFormat(workbook.createDataFormat().getFormat("0.00E+00"));cell.setCellStyle(style);HSSFDataFormat.getFormat和HSSFDataFormat.getBuiltinFormat的区别:当使用Excel内嵌的(或者说预定义)的格式时,直接用HSSFDataFormat.getBuiltinFormat静态方法即可。
sxssfworkbook读取excel用法-回复SXSSFWorkbok是Apache POI开发的一个针对大数据量Excel文件的读写工具。
在处理大型Excel文件时,传统的XSSFWorkbook可能会导致内存溢出,而SXSSFWorkbook则能够在内存使用上做出一定的优化。
一、什么是Apache POI?Apache POI是一个开源的Java API库,用于操作Microsoft Office格式的文件,包括Excel、Word和PowerPoint等。
Apache POI提供了一组类和方法,使得我们能够读取和写入Excel文件,操作单元格、行和列,设置样式和格式等。
二、为什么需要SXSSFWorkbook?在处理大型Excel文件时,通常会出现内存溢出的问题。
这是因为传统的XSSFWorkbook是将整个Excel文件加载到内存中,对内存的消耗较高,并且当Excel文件较大时,加载整个文件可能会导致内存溢出的问题。
SXSSFWorkbook是Apache POI在XSSFWorkbook的基础上进行了优化,采用了流式处理的方式来读写Excel文件。
它的设计理念是将Excel 文件拆分成多个片段,每次只处理一部分数据,然后将其写入临时文件,从而减少了对内存的消耗。
因此,SXSSFWorkbook适用于处理大型Excel文件,可以有效地解决内存溢出的问题。
三、SXSSFWorkbook的基本用法1. 导入必要的类库首先,我们需要在项目中导入Apache POI相关的类库,包括poi、poi-ooxml和poi-ooxml-schemas等。
2. 创建SXSSFWorkbook对象使用SXSSFWorkbok的构造方法可以创建一个SXSSFWorkbook对象,例如:javaSXSSFWorkbook workbook = new SXSSFWorkbook();3. 设置临时文件存储路径SXSSFWorkbook会将数据写入临时文件,默认存储路径是系统的临时文件夹。
POI是一种常用的Java库,用于操作Microsoft Office文档,它提供了一系列的API,可以帮助开发者对Word、Excel、PowerPoint等文件进行读写操作。
在使用POI对Excel文件进行操作时,经常会遇到需要对数字进行格式化的情况,其中包括对数字进行千分位格式化。
而Excel中的千分位格式化在展示大数字时非常有用,可以让数据更易读、易懂。
本文将深入介绍使用POI对Excel中的数字进行千分位格式化的方法。
1. 概述Excel作为一种常见的数据处理工具,在企业和个人中被广泛使用。
在使用Excel处理数据时,如何呈现数据对于数据的直观理解非常重要。
在处理大数字时,我们经常需要将数字进行千分位格式化,以便更清晰地展示数据。
而在使用POI对Excel进行操作时,如何实现对数字的千分位格式化成为了一个常见的需求。
2. POI简介Apache POI是一种开源的Java库,提供了一组可以处理Microsoft Office文件的API。
POI可以帮助开发者读取、修改和创建Word、Excel、PowerPoint等文件,是Java领域中处理Office文档的重要工具。
在处理Excel文件时,POI可以帮助开发者进行单元格格式的设置,包括对数字进行千分位格式化。
3. Excel中的千分位格式化在Excel中,对数字进行千分位格式化是一种常见的需求。
通过千分位格式化,可以让数字更易读、易懂。
在Excel中,可以通过以下步骤对数字进行千分位格式化:- 选中需要格式化的单元格或单元格范围- 右键点击选中的单元格,选择“格式单元格”- 在弹出的对话框中选择“数字”选项卡- 选择“数值”分类,并在“小数点”后面的下拉框中选择“使用千位分隔符(,)”选项- 点击“确定”按钮,完成千分位格式化的设置4. 使用POI对Excel进行千分位格式化在使用POI对Excel进行操作时,我们可以通过以下步骤实现对数字的千分位格式化:1. 创建一个新的工作簿```javaWorkbook wb = new HSSFWorkbook(); // 使用HSSFWorkbook创建一个新的Excel工作簿```2. 创建一个工作表```javaSheet sheet = wb.createSheet("千分位格式化示例"); // 创建一个名为“千分位格式化示例”的工作表```3. 创建一个单元格样式,并设置千分位格式化```javaCellStyle style = wb.createCellStyle(); // 创建一个单元格样式style.setDataFormat(BuiltinFormats.getBuiltinFormat("#,##0")); // 设置单元格样式的数据格式为千分位格式```4. 创建一个单元格,并将数字赋值给该单元格```javaRow row = sheet.createRow(0); // 创建第一行Cell cell = row.createCell(0); // 创建第一列cell.setCellValue(xxx.89); // 向单元格中赋值cell.setCellStyle(style); // 应用之前创建的样式```5. 将工作簿写入文件```javatry (FileOutputStream fileOut = new FileOutputStream("workbook.xls")) {wb.write(fileOut); // 将工作簿写入文件}```5. 结语通过本文的介绍,相信大家对使用POI对Excel中的数字进行千分位格式化有了更清晰的认识。
hssfworkbook方法HSSFWorkbook方法是Apache POI库中的一个重要类,用于处理Excel文件的读写操作。
本文将详细介绍HSSFWorkbook方法的使用,并探讨其在实际应用中的一些注意事项。
一、HSSFWorkbook方法简介HSSFWorkbook是Apache POI库中用于处理Excel文件的核心类之一。
它提供了一系列方法,可以创建、打开、读取和保存Excel 文件。
HSSF代表“Horrible Spreadsheet Format”,是POI库中用于处理Excel 97-2003文件格式的类库。
二、创建HSSFWorkbook对象要创建一个HSSFWorkbook对象,可以使用HSSFWorkbook的构造方法。
以下是创建一个新的Excel文件的示例代码:```javaHSSFWorkbook workbook = new HSSFWorkbook();```三、创建工作表在HSSFWorkbook对象中,可以使用createSheet方法来创建一个新的工作表。
以下是创建一个名为“Sheet1”的工作表的示例代码:```javaHSSFSheet sheet = workbook.createSheet("Sheet1");```四、设置单元格的值要设置单元格的值,可以使用setCellValue方法。
以下是将字符串“Hello World”设置到A1单元格的示例代码:```javaHSSFRow row = sheet.createRow(0);HSSFCell cell = row.createCell(0);cell.setCellValue("Hello World");```五、读取单元格的值要读取单元格的值,可以使用getCell方法。
以下是读取A1单元格的值的示例代码:```javaHSSFRow row = sheet.getRow(0);HSSFCell cell = row.getCell(0);String value = cell.getStringCellValue();```六、保存Excel文件要保存Excel文件,可以使用write方法将HSSFWorkbook对象写入输出流。
使⽤POI⽣成Excel⽂件,可以⾃动调整excel列宽在开发中经常需要⽤到对Excel⽂件的操作,现在根据⽹上的资料整理如下:import java.io.FileOutputStream;import ermodel.HSSFCell;import ermodel.HSSFCellStyle;import ermodel.HSSFFont;import ermodel.HSSFRow;import ermodel.HSSFSheet;import ermodel.HSSFWorkbook;import ermodel.HSSFRichTextString;import ermodel.HSSFDataFormat;import ermodel.HSSFComment;import ermodel.HSSFPatriarch;import ermodel.HSSFClientAnchor;public class PoiCreateExcelTest {public static void main(String[] args) {/*** @see <a href="/hssf/quick-guide.html#NewWorkbook">For more</a>*/// 创建新的Excel ⼯作簿HSSFWorkbook workbook = new HSSFWorkbook();// 在Excel⼯作簿中建⼀⼯作表,其名为缺省值, 也可以指定Sheet名称HSSFSheet sheet = workbook.createSheet();//HSSFSheet sheet = workbook.createSheet("SheetName");// ⽤于格式化单元格的数据HSSFDataFormat format = workbook.createDataFormat();// 创建新⾏(row),并将单元格(cell)放⼊其中. ⾏号从0开始计算.HSSFRow row = sheet.createRow((short) 1);// 设置字体HSSFFont font = workbook.createFont();font.setFontHeightInPoints((short) 20); //字体⾼度font.setColor(HSSFFont.COLOR_RED); //字体颜⾊font.setFontName("⿊体"); //字体font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //宽度font.setItalic(true); //是否使⽤斜体// font.setStrikeout(true); //是否使⽤划线// 设置单元格类型HSSFCellStyle cellStyle = workbook.createCellStyle();cellStyle.setFont(font);cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); //⽔平布局:居中cellStyle.setWrapText(true);// 添加单元格注释// 创建HSSFPatriarch对象,HSSFPatriarch是所有注释的容器.HSSFPatriarch patr = sheet.createDrawingPatriarch();// 定义注释的⼤⼩和位置,详见⽂档HSSFComment comment = patr.createComment(new HSSFClientAnchor(0, 0, 0, 0, (short)4, 2, (short) 6, 5));// 设置注释内容comment.setString(new HSSFRichTextString("可以在POI中添加注释!"));// 设置注释作者. 当⿏标移动到单元格上是可以在状态栏中看到该内容.comment.setAuthor("Xuys.");// 创建单元格HSSFCell cell = row.createCell((short) 1);HSSFRichTextString hssfString = new HSSFRichTextString("Hello World!");cell.setCellValue(hssfString);//设置单元格内容cell.setCellStyle(cellStyle);//设置单元格样式cell.setCellType(HSSFCell.CELL_TYPE_STRING);//指定单元格格式:数值、公式或字符串cell.setCellComment(comment);//添加注释//格式化数据row = sheet.createRow((short) 2);cell = row.createCell((short) 2);cell.setCellValue(11111.25);cellStyle = workbook.createCellStyle();cellStyle.setDataFormat(format.getFormat("0.0"));cell.setCellStyle(cellStyle);row = sheet.createRow((short) 3);cell = row.createCell((short) 3);cell.setCellValue(9736279.073);cellStyle = workbook.createCellStyle();cellStyle.setDataFormat(format.getFormat("#,##0.0000"));cell.setCellStyle(cellStyle);sheet.autoSizeColumn((short)0); //调整第⼀列宽度sheet.autoSizeColumn((short)1); //调整第⼆列宽度sheet.autoSizeColumn((short)2); //调整第三列宽度sheet.autoSizeColumn((short)3); //调整第四列宽度try {FileOutputStream fileOut = new FileOutputStream("C:/3.xls");workbook.write(fileOut);fileOut.close();} catch (Exception e) {System.out.println(e.toString());}}}最后⾃动调整列宽的代码是在找了好久以后不经意间找着的,很惊喜!如果编译器提⽰没有autoSizeColumn这个⽅法,那可能是你的poi版本太低的缘故,我⽤的是poi3.0版本。
一、POI简介Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
二、HSSF概况HSSF 是Horrible SpreadSheet Format的缩写,通过HSSF,你可以用纯Java代码来读取、写入、修改Excel文件。
HSSF 为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”。
三、POI EXCEL文档结构类HSSFWorkbook excel文档对象HSSFSheet excel的sheet HSSFRow excel的行HSSFCell excel的单元格HSSFFont excel字体HSSFName 名称HSSFDataFormat 日期格式HSSFHeader sheet头HSSFFooter sheet尾HSSFCellStyle cell样式HSSFDateUtil 日期HSSFPrintSetup 打印HSSFErrorConstants 错误信息表四、EXCEL常用操作方法4、取得sheet的数目共享知识分享快乐说明:FormulaEvaluator提供了evaluateFormulaCell(Cell cell)方法,计算公式保存结果,但不改变公式。
而evaluateInCell(Cell cell) 方法是计算公式,并将原公式替换为计算结果,也就是说该单元格的类型不在是Cell.CELL_TYPE_FORMULA而是Cell.CELL_TYPE_NUMBERIC。
HSSFFormulaEvaluator提供了静态方法evaluateAllFormulaCells(HSSFWorkbook wb) ,计算一个Excel文件的所有公式,用起来很方便。
卑微如蝼蚁、坚强似大象。
JavaPoi读取excel对所有类型进⾏处理1、最近做了⼀个批量导⼊功能 , 发现poi读取excel的⽇期类型会出现问题,源于⽇期类型分为以下⼏种:①、yyyy/MM/dd②、HH:mm:ss③、yyyy/MM/dd HH:mm:ss2、解决思路:⽇期,数字的类型都是数值的, 所有需要对每⼀个进⾏区分,根据cell.getCellStyle().getDataFormat() ⽅法可以得到excel 格⼦中的short类型的值 ,从断点中得知 yyyy/MM/dd 格式的值是 14HH:mm:ss 格式的值是 21yyyy/MM/dd HH:mm:ss 格式的值是 22double 和 Int 都是 0 (我都转成转成String 再去做进⼀步处理)3、java代码如下:1public static String getCellValue(Cell cell) {2 String cellValue = "";3if (cell == null) {4return cellValue;5 }6// 判断数据的类型7switch (cell.getCellType()) {8case Cell.CELL_TYPE_NUMERIC: // 数字9//short s = cell.getCellStyle().getDataFormat();10if (HSSFDateUtil.isCellDateFormatted(cell)) {// 处理⽇期格式、时间格式11 SimpleDateFormat sdf = null;12// 验证short值13if (cell.getCellStyle().getDataFormat() == 14) {14 sdf = new SimpleDateFormat("yyyy/MM/dd");15 } else if (cell.getCellStyle().getDataFormat() == 21) {16 sdf = new SimpleDateFormat("HH:mm:ss");17 } else if (cell.getCellStyle().getDataFormat() == 22) {18 sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");19 } else {20throw new RuntimeException("⽇期格式错误");21 }22 Date date = cell.getDateCellValue();23 cellValue = sdf.format(date);24 } else if (cell.getCellStyle().getDataFormat() == 0) {//处理数值格式25 cell.setCellType(Cell.CELL_TYPE_STRING);26 cellValue = String.valueOf(cell.getRichStringCellValue().getString());27 }28break;29case Cell.CELL_TYPE_STRING: // 字符串30 cellValue = String.valueOf(cell.getStringCellValue());31break;32case Cell.CELL_TYPE_BOOLEAN: // Boolean33 cellValue = String.valueOf(cell.getBooleanCellValue());34break;35case Cell.CELL_TYPE_FORMULA: // 公式36 cellValue = String.valueOf(cell.getCellFormula());37break;38case Cell.CELL_TYPE_BLANK: // 空值39 cellValue = null;40break;41case Cell.CELL_TYPE_ERROR: // 故障42 cellValue = "⾮法字符";43break;44default:45 cellValue = "未知类型";46break;47 }48return cellValue;49 }注:本⽂部分内容转载暂时先标记,⽇后有完善会更新。
POI实现excel的数据验证⽬录前⾔Apache POI是Apache软件基⾦会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
实际开发中,⽤POI来读写excel⽂档的⽐较多。
所以,这⾥记录下⽤POI读取excel⽂档的⼀些难点做下记录。
难点1:合并单元格在实际开发中,有时会遇到如图⽰例,需要按照如图所⽰进⾏导出excel⽂件。
这就涉及到了合并单元格和给单元格赋值的问题。
代码实现策略:step 1: 合并单元格eventSheet.addMergedRegion(new CellRangeAddress(lineNum, fields.size() + lineNum - 1, 1, 1));step 2: 给单元格赋值按照正常给单元格赋值即可,只是在合并的单元格第⼀⾏赋值就⾏,不⽤重复赋值;cell = row.createCell((short) 1);cell.setCellValue(eventVO.getEventId());cell.setCellStyle(align_center_style);难点2:数据验证-下拉框在导出excel⽂件时,需要添加数据验证的下拉框。
如图:代码实现策略:step 1:设置需要进⾏数据验证的单元格范围和可供选择的值/*** 设置 excel数据验证** @param firstRow* @param firstCol* @param endRow* @param endCol* @param strList 可供选择的值* @return* @since @ 2018年3⽉14⽇*/XSSFDataValidation getDataValidationList(XSSFSheet sheet, short firstRow, short firstCol, short endRow, short endCol, List<String> strList) {String[] datas = strList.toArray(new String[0]);XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper(sheet);XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint) dvHelper.createExplicitListConstraint(datas);CellRangeAddressList addressList = new CellRangeAddressList(firstRow, endRow, firstCol, endCol);XSSFDataValidation validation = (XSSFDataValidation) dvHelper.createValidation(dvConstraint, addressList);return validation;}step 2:给当前sheet添加数据验证sheet.addValidationData(line2ValidationList);难点3:数据验证-某列保证唯⼀性有时候在excel⽂件的某列添加数据时,需要保证某列的数据唯⼀。
poi excel公式处理POI 是 Java 中一个操作Ms Office格式文件的开源框架,可以使用POI来处理Excel文件。
首先,你需要在你的Java项目中引入POI的依赖,这可以通过在你的pom.xml文件中添加以下代码来实现:```xml<dependencies><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency></dependencies>```在使用POI之前,你需要导入一些必要的类:```javaimport ermodel.*;import ermodel.XSSFWorkbook;import ermodel.XSSFFormulaEvaluator; ```现在,你可以开始编写代码来处理Excel文件了。
首先,打开一个已有的Excel文件或者创建一个新的Excel文件:```javaWorkbook workbook = new XSSFWorkbook(); // 创建一个新的Excel文件// 你也可以打开一个已有的Excel文件// Workbook workbook = WorkbookFactory.create(newFile("path/to/your/file.xlsx"));```接下来,你需要获取一个Sheet对象来操作Excel文件中的表格:```javaSheet sheet = workbook.createSheet("Sheet1"); // 创建一个新的Sheet// 你也可以通过索引来获取已有的Sheet// Sheet sheet = workbook.getSheetAt(0);```你可以使用以下代码在表格中设置一个单元格的值:```javaRow row = sheet.createRow(0); // 创建第一行Cell cell = row.createCell(0); // 创建第一列cell.setCellValue(10); // 设置单元格的值```你还可以使用以下代码来设置一个单元格的公式:```javarow = sheet.createRow(1);cell = row.createCell(0);cell.setCellValue(20);// 设置公式cell = row.createCell(1);cell.setCellFormula("A1+B1");```最后,你需要执行以下代码来计算表格中的公式:```javaFormulaEvaluator evaluator =workbook.getCreationHelper().createFormulaEvaluator(); evaluator.evaluateAll();```你可以将文件保存到磁盘上:```javaFileOutputStream fileOut = newFileOutputStream("path/to/your/file.xlsx");workbook.write(fileOut);fileOut.close();```这就是使用POI处理Excel文件的基本步骤。
sxssfworkbook读取excel用法一、简介sxssfworkbook是ApachePOI库中的一个类,用于读取Excel文件。
它提供了方便的方法来读取Excel文件中的数据,包括单元格的值、格式、公式等。
二、基本用法1.引入库在使用sxssfworkbook之前,需要先引入ApachePOI库。
可以通过在代码中添加以下语句来引入库:```pythonermodel.Workbook;ermodel.XSSFWorkbook;```2.创建Workbook对象使用XSSFWorkbook类创建一个Workbook对象,该对象表示Excel文件。
可以通过以下代码创建对象:```javaWorkbookworkbook=newXSSFWorkbook("path/to/excel/file.xlsx ");```其中,"path/to/excel/file.xlsx"是Excel文件的路径。
如果Excel文件不在项目文件夹中,则需要提供完整的文件路径。
3.读取单元格数据使用sxssfworkbook的cell()方法可以读取Excel文件中指定单元格的数据。
可以通过指定单元格的行和列号来获取数据。
例如,以下代码可以读取第一个工作表的A1单元格的值:```javaCellcell=workbook.getSheetAt(0).getRow(0).getCell(0);Stringvalue=cell.getStringCellValue();```其中,第一个参数表示工作表的索引(从0开始),第二个参数表示行号,第三个参数表示列号。
getCell()方法返回一个Cell对象,可以使用该对象的getStringCellValue()方法获取单元格的值。
4.读取单元格格式使用sxssfworkbook的cell().getCellStyle()方法可以获取单元格的样式,包括字体、颜色、对齐方式等。
poi 条件格式规则-回复POI条件格式规则条件格式是一种在Excel中使数据更直观和易于理解的技术。
POI (Poor Obfuscation Implementation)是一个用于读写Microsoft Excel文件的Java库。
POI库提供了一套功能强大的API,可以使用条件格式规则创建和管理Excel中的条件格式。
在本文中,我们将一步一步地回答POI条件格式规则的问题,为您提供有关如何使用POI在Excel中创建和应用条件格式的详细解释。
第一步:POI库的导入和配置要开始使用POI条件格式规则,首先需要导入POI库,并确保您的Java 环境已正确配置。
您可以从Apache POI项目官方网站(接下来,您需要在您的项目中配置POI库。
这可以通过添加POI库的JAR文件到您的项目的构建路径来完成。
您还可以使用Maven或Gradle 等构建工具来管理POI库的依赖关系。
第二步:创建Excel文件创建一个新的Excel文件是使用POI条件格式规则的第一步。
您可以使用HSSFWorkbook类(用于xls格式)或XSSFWorkbook类(用于xlsx格式)来创建Excel文件。
以下是使用POI创建Excel文件的示例代码。
java导入所需的POI类import ermodel.*;创建一个新的工作簿Workbook workbook = new XSSFWorkbook();创建一个新的工作表Sheet sheet = workbook.createSheet("Sheet1");在单元格A1中写入数据Row row = sheet.createRow(0);Cell cell = row.createCell(0);cell.setCellValue("Hello World");保存工作簿FileOutputStream fileOut = newFileOutputStream("path/to/save/excel/file.xlsx");workbook.write(fileOut);fileOut.close();workbook.close();第三步:创建条件格式规则在Excel文件中创建条件格式规则是POI条件格式规则的核心部分。
一、Excel基础 二、HSSF概况 三、通过usermodel读取文件 四、通过usermodel写入文件 五、通过eventusermodel读取文件 六、HSSF电子表格结构 七、通过HPSF读取文档属性 八、文档摘要信息 九、附录 ━━━━━━ 正文: ━━━━━━ 在上一篇文章中,我们介绍了POI项目的基本概念,了解了如何用POI来读写OLE 2复合文档结构,并给出了两个简单的例子:用POI来读写Excel文件的Workbook流。本文继续前文的话题,阐述如何用POI来读取/写入完整的Excel文件。
约定:POI项目2.0版现在已经接近正式发行阶段,开发进度迅速,不断有新的功能集成到原有的系统,同时也有对原有系统的修改。为了保证本文的及时性,本文将按照最近的1.9开发版说明。虽然编译最近的发行版源代码也能正常运行,但现在的代码和2.0的发行版会有一些出入。
一、Excel基础 Microsoft Excel 97文件格式也被称为BIFF8,最近版本的Excel只对该格式作了少量的改动。增加对新格式的支持除了增加项目的复杂性之外,唯一的效果也许只是不得不使每个用户升级代码,没有什么实际的好处。因此,在下文说明中,凡是提到Excel 97格式的地方其实都是指Excel从97到XP的格式。
二、HSSF概况 POI项目实现的Excel 97文件格式称为HSSF——也许你已经猜到,HSSF是Horrible SpreadSheet Format的缩写,也即“讨厌的电子表格格式”(微软使某些原本简单的事情过分复杂,同时又过分简单地处理了某些原本需要灵活性的事情,让人不胜佩服!)也许HSSF的名字有点滑稽,就本质而言它是一个非常严肃、正规的API。通过HSSF,你可以用纯Java代码来读取、写入、修改Excel文件。
前面一篇文章提到了POIFS,那么HSSF和POIFS又有什么关系呢?就象其他POI的API一样,HSSF建立在 POIFS的基础上,因此在HSSF内的有些代码和前文的某些代码很相似。不过,当我们编写基于HSSF API的代码时,一般不需要了解POIFS API的细节。
HSSF为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”。前者很好理解,后者比较抽象,但操作效率要高得多。usermodel主要有 org.apache.poi.hssf.usermodel和org.apache.poi.hssf.eventusermodel包实现(在 HSSF的早期版本中,org.apache.poi.hssf.eventusermodel属于eventmodel包)。
usermodel包把Excel文件映射成我们熟悉的结构,诸如Workbook、Sheet、Row、Cell等,它把整个结构以一组对象的形式保存在内存之中。eventusermodel要求用户熟悉文件格式的底层结构,它的操作风格类似于XML的SAX API和AWT的事件模型(这就是eventusermodel名称的起源),要掌握窍门才能用好。另外,eventusermodel的API只提供读取文件的功能,也就是说不能用这个API来修改文件。
三、通过usermodel读取文件 用HSSF的usermodel读取文件很简单。首先创建一个InputStream,然后创建一个HSSFWorkbook:
InputStream myxls = new FileInputStream("workbook.xls")); HSSFWorkbook wb = new HSSFWorkbook(myxls);
有了HSSFWorkbook实例,接下来就可以提取工作表、工作表的行和列,例如: HSSFSheet sheet = wb.getSheetAt(0); // 第一个工作表 HSSFRow row = sheet.getRow(2); // 第三行 HSSFCell cell = row.getCell((short)3); // 第四个单元格
上面这段代码提取出第一个工作表第三行第四单元格。利用单元格对象可以获得它的值,提取单元格的值时请注意它的类型:
if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING) { ("单元格是字符串,值是: " + cell.getStringCellValue()); } else if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) { ("单元格是数字,值是: " + cell.getCellValue()); } else () { ("单元格的值不是字符串或数值。"); } 如果搞错了数据类型,程序将遇到异常。特别地,用HSSF处理日期数据要小心。Excel内部以数值的形式保存日期数据,区别日期数据的唯一办法是通过单元格的格式(如果你曾经在Excel中设置过日期格式,应该明白这是什么意思)。
因此,对于包含日期数据的单元格,cell.getCellType()将返回HSSFCell.CELL_TYPE_NUMERIC,不过利用工具函数HSSFDateUtil.isCellDateFormatted(cell)可以判断出单元格的值是否为日期。 isCellDateFormatted函数通过比较单元格的日期和Excel的内置日期格式得出结论——可以想象,按照这种判断方法,很多时候 isCellDateFormatted函数会返回否定的结论,存在一定的误判可能。
本文附录包含了一个在Servlet环境中利用HSSF创建和返回Excel工作簿的实例。 四、通过usermodel写入文件 写入XLS文件比读取XLS文件还要简单。创建一个HSSFWorkbook实例,然后在适当的时候创建一个把文件写入磁盘的OutputStream,但延迟到处理结束时创建OutputStream也可以:
HSSFWorkbook wb = new HSSFWorkbook(); FileOutputStream fileOut = new FileOutputStream("workbook.xls"); wb.write(fileOut); fileOut.close();
创建工作表及其内容必须从相应的父对象出发,例如: HSSFSheet sheet = wb.createSheet(); HSSFRow row = sheet.createRow((short)0); HSSFCell cell = row.createCell((short)0); cell.setCellValue(1); row.createCell((short)1).setCellValue(1.2); row.createCell((short)2).setCellValue("一个字符串"); row.createCell((short)3).setCellValue(true);
如果要设置单元格的样式,首先要创建一个样式对象,然后把它指定给一个单元格——或者把它指定给多个具有相同样式的单元格,例如,如果Excel表格中有一个摘要行,摘要行的数据必须是粗体、斜体,你可以创建一个summaryRowStyle样式对象,然后把这个样式指定给所有摘要行上的单元格。
注意,CellFormat和CellStyle对象是工作簿对象的成员,单元格对象只是引用它们。 ... HSSFCellStyle style = workbook.createCellStyle(); style.setDataFormat (HSSFDataFormat.getBuiltinFormat("($#,##0_);[Red]($#,##0)")); style.setFillBackgroundColor(HSSFColor.AQUA.index); style.setFillPattern(HSSFCellStyle.BIG_SPOTS); ... someCell.setCellStyle(style); someOtherCell.setCellStyle(style);
版本较新的HSSF允许使用数量有限的Excel公式。这一功能目前还是“Beta级质量”,正式使用之前务必仔细测试。指定公式的方式类如:someCell.setCellFormula(SUM(A1:A2:);。
当前,公式中已经可以调用所有内建的函数或操作符,但逻辑操作符和函数(例如IF函数)除外,这部分功能目前还在开发之中。
五、通过eventusermodel读取文件 通过eventusermodel读取文件要比使用usermodel复杂得多,但效率也要高不少,因为它要求应用程序一边读取数据,一边处理数据。 eventusermodel实际上模拟了DOM环境下SAX处理XML文档的办法,应用程序首先要注册期望处理的数据,eventusermodel将在遇到匹配的数据结构时回调应用程序注册的方法。使用eventusermodel最大的困难在于你必须熟悉Excel工作簿的内部结构。
在HSSF中,低层次的二进制结构称为记录(Record)。记录有不同的类型,每一种类型由org.apache.poi.hssf.record包中的一个Java类描述。例如,BOFRecord记录表示Workbook或Sheet区域的开始,RowRecord表示有一个行存在并保存其样式信息。所有具有CellValueRecordInterface接口的记录表示Excel的单元格,包括NumericRecord、 LabelSSTRecord和FormulaRecord(还有其他一些,其中部分已被弃置不用,部分用于优化处理,但一般而言,HSSF可以转换它们)。
下面是一个注册事件处理句柄的例子: private EventRecordFactory factory = new EventRecordFactory(); factory.registerListener(new ERFListener() { public boolean processRecord(Record rec) { (got BOF Record); return true; } }, new short[] {BOFRecord.sid}); factory.processRecords(someInputStream);