poi生成Excel

 需要用到的jar包:poi-3.9-20121203.jar。

        源代码示例:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  *  
  3.  */  
  4. package com.geloin.poi.bean;  
  5.   
  6. import java.util.Date;  
  7.   
  8. /** 
  9.  * @author Geloin 
  10.  *  
  11.  */  
  12. public class Person {  
  13.   
  14.     /** 
  15.      * 姓名 
  16.      */  
  17.     private String name;  
  18.   
  19.     /** 
  20.      * 年龄 
  21.      */  
  22.     private Integer age;  
  23.   
  24.     /** 
  25.      * 生日 
  26.      */  
  27.     private Date birthday;  
  28.   
  29.     /** 
  30.      * 是否学生 
  31.      */  
  32.     private boolean isStudent;  
  33.   
  34.     /** 
  35.      * 身高 
  36.      */  
  37.     private double height;  
  38.   
  39.     public String getName() {  
  40.         return name;  
  41.     }  
  42.   
  43.     public void setName(String name) {  
  44.         this.name = name;  
  45.     }  
  46.   
  47.     public Integer getAge() {  
  48.         return age;  
  49.     }  
  50.   
  51.     public void setAge(Integer age) {  
  52.         this.age = age;  
  53.     }  
  54.   
  55.     public Date getBirthday() {  
  56.         return birthday;  
  57.     }  
  58.   
  59.     public void setBirthday(Date birthday) {  
  60.         this.birthday = birthday;  
  61.     }  
  62.   
  63.     public boolean isStudent() {  
  64.         return isStudent;  
  65.     }  
  66.   
  67.     public void setStudent(boolean isStudent) {  
  68.         this.isStudent = isStudent;  
  69.     }  
  70.   
  71.     public double getHeight() {  
  72.         return height;  
  73.     }  
  74.   
  75.     public void setHeight(double height) {  
  76.         this.height = height;  
  77.     }  
  78.   
  79. }  

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  *  
  3.  */  
  4. package com.geloin.poi.main;  
  5.   
  6. import java.io.File;  
  7. import java.io.FileOutputStream;  
  8. import java.io.OutputStream;  
  9. import java.text.SimpleDateFormat;  
  10. import java.util.ArrayList;  
  11. import java.util.List;  
  12.   
  13. import org.apache.poi.hssf.usermodel.HSSFCell;  
  14. import org.apache.poi.hssf.usermodel.HSSFCellStyle;  
  15. import org.apache.poi.hssf.usermodel.HSSFFont;  
  16. import org.apache.poi.hssf.usermodel.HSSFRichTextString;  
  17. import org.apache.poi.hssf.usermodel.HSSFRow;  
  18. import org.apache.poi.hssf.usermodel.HSSFSheet;  
  19. import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
  20. import org.apache.poi.ss.util.CellRangeAddress;  
  21.   
  22. import com.geloin.poi.bean.Person;  
  23.   
  24. /** 
  25.  * @author Geloin 
  26.  *  
  27.  */  
  28. public class PoiTest {  
  29.   
  30.     /** 
  31.      *  
  32.      * @param args 
  33.      * @throws Exception 
  34.      */  
  35.     public static void main(String[] args) throws Exception {  
  36.   
  37.         SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");  
  38.   
  39.         List<Person> data = new ArrayList<Person>();  
  40.         Person person1 = new Person();  
  41.         person1.setName("张三");  
  42.         person1.setAge(20);  
  43.         person1.setBirthday(format.parse("1989-11-12"));  
  44.         person1.setStudent(true);  
  45.         person1.setHeight(168.8);  
  46.         data.add(person1);  
  47.         Person person2 = new Person();  
  48.         person2.setName("李四");  
  49.         person2.setAge(21);  
  50.         person2.setBirthday(format.parse("1988-11-12"));  
  51.         person2.setStudent(false);  
  52.         person2.setHeight(169.8);  
  53.         data.add(person2);  
  54.   
  55.         String exportPath = "d:/work/proTmp/geloin/poi/export.xls";  
  56.         OutputStream out = new FileOutputStream(new File(exportPath));  
  57.   
  58.         // 声明一个工作薄  
  59.         HSSFWorkbook workbook = new HSSFWorkbook();  
  60.         // 生成一个表格  
  61.         HSSFSheet sheet = workbook.createSheet("sheet的名称");  
  62.         // 设置表格默认列宽度为15个字节  
  63.         sheet.setDefaultColumnWidth(15);  
  64.   
  65.         // 设置标题  
  66.         HSSFCellStyle titleStyle = workbook.createCellStyle();  
  67.         // 居中显示  
  68.         titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);  
  69.         // 标题字体  
  70.         HSSFFont titleFont = workbook.createFont();  
  71.         // 字体大小  
  72.         titleFont.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);  
  73.         titleStyle.setFont(titleFont);  
  74.   
  75.         HSSFCellStyle contentStyle = workbook.createCellStyle();  
  76.         contentStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);  
  77.         HSSFFont contentFont = workbook.createFont();  
  78.         contentFont.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);  
  79.         contentStyle.setFont(contentFont);  
  80.   
  81.         // 产生表格标题行  
  82.         HSSFRow row = sheet.createRow(0);  
  83.         String[] headers = new String[] { "序号""姓名""年龄""出生年月""是否学生",  
  84.                 "身高" };  
  85.         for (int i = 0; i < headers.length; i++) {  
  86.             HSSFCell cell = row.createCell(i);  
  87.             HSSFRichTextString text = new HSSFRichTextString(headers[i]);  
  88.             cell.setCellValue(text);  
  89.             cell.setCellStyle(titleStyle);  
  90.         }  
  91.   
  92.         int rowCount = 1;  
  93.         for (int i = 0; i < data.size(); i++, rowCount++) {  
  94.             HSSFRow dataRow = sheet.createRow(rowCount);  
  95.             Person person = data.get(i);  
  96.   
  97.             // 序号  
  98.             HSSFCell cell0 = dataRow.createCell(0);  
  99.             cell0.setCellValue((i + 1));  
  100.             cell0.setCellStyle(contentStyle);  
  101.   
  102.             // 姓名  
  103.             HSSFCell cell1 = dataRow.createCell(1);  
  104.             cell1.setCellValue(person.getName());  
  105.             cell1.setCellStyle(contentStyle);  
  106.   
  107.             // 年龄,转化为String后放到cell里面  
  108.             HSSFCell cell2 = dataRow.createCell(2);  
  109.             cell2.setCellValue(person.getAge().toString());  
  110.             cell2.setCellStyle(contentStyle);  
  111.   
  112.             // 出生年月,转化为String后放到cell里面  
  113.             HSSFCell cell3 = dataRow.createCell(3);  
  114.             cell3.setCellValue(format.format(person.getBirthday()));  
  115.             cell3.setCellStyle(contentStyle);  
  116.   
  117.             // 是否学生,转化为String后放到cell里面  
  118.             HSSFCell cell4 = dataRow.createCell(4);  
  119.             String isStudent = person.isStudent() ? "是" : "否";  
  120.             cell4.setCellValue(isStudent);  
  121.             cell4.setCellStyle(contentStyle);  
  122.   
  123.             // 身高,转化为String后放到cell里面  
  124.             HSSFCell cell5 = dataRow.createCell(5);  
  125.             cell5.setCellValue(String.valueOf(person.getHeight()));  
  126.             cell5.setCellStyle(contentStyle);  
  127.         }  
  128.   
  129.         // 合并,从第一行到最后一行,从第七列到第七列  
  130.         sheet.addMergedRegion(new CellRangeAddress(0, rowCount - 166));  
  131.         // 合并单元格的内容,合并单元格后,仅会保留第一行,第七列的内容,所以设置第一行第七列的内容  
  132.         HSSFCell cell6 = row.createCell(6);  
  133.         cell6.setCellStyle(contentStyle);  
  134.         cell6.setCellValue("合并单元格的内容");  
  135.   
  136.         workbook.write(out);  
  137.     }  
  138. }  

        简略过程:

        1. 通过new HSSFWorkBook生成一个workBook;

        2. 通过workBook的createSheet生成一个sheet,即工作表,同时可为工作表命名;

        3. 通过sheet的createRow生成一行,sheet中的行数从0开始,表示第一行;

        4. 通过row的createCell生成一列,sheet中的列数从0开始,表示第一列;

        5. 通过workBook.write,将内容输出到一个excel文件中。


        主要说明:

        1. HSSFCellStyle用于设定单元格的style;

        2. HSSFFont用于设定单元格的字体;

        3. 通过sheet.addMergedRegion(开始行号,结束行号,开始列号,结束列号)方法,可合并单元格,当需要合并多行的某列时,设置开始列号等于结束列号即可;当需要合并多列的某行时,设置开始行号等于结束行号即可;

        4. Excel有一特性——合并多行时,合并后的内容为合并中的第一行的内容;合并多列时,合并后的内容为合并中的多列的最左上角一列的内容——所以在合并时,只需要设置指定的单元格的内容,即可设置合并后的单元格的内容;

        5. 行号和列号均是从0开始的,表示第一行或第一列。


文章转载:http://blog.youkuaiyun.com/geloin/article/details/17219885

<think>好的,我现在需要帮助用户解决如何使用Apache POI生成Excel文件的问题。用户还希望看到示例代码,并且是用Java写的。首先,我得回忆一下Apache POI的相关知识,特别是关于创建Excel文件的部分。 根据用户提供的引用内容,引用[1][2]提到Apache POI可以用于创建、写入读取Excel文件,尤其是引用[2]指出POI可以写入数据到Excel。引用[5]也提到POI支持Excel文件的读写。此外,引用[4]比较了POIEasyExcel的内存管理,说明在处理大数据量时POI可能消耗较多内存,但用户的问题主要是生成文件,所以暂时不需要考虑优化,但可能需要提醒用户注意内存问题。 首先,我需要确定用户可能需要的步骤。生成Excel文件通常包括创建Workbook对象,创建Sheet,创建行单元格,设置单元格的值样式,最后将文件写入磁盘。 接下来,我应该检查是否需要处理不同版本的Excel文件,比如.xls(HSSF).xlsx(XSSF)。根据引用[5],POI支持OOXMLOLE2格式,所以需要区分HSSFWorkbookXSSFWorkbook。用户可能希望生成较新的.xlsx文件,所以示例代码应该使用XSSF。 然后,单元格样式的设置也是一个重要部分,如字体、颜色、对齐方式等。引用[1]提到本教程包括单元格样式设置,所以示例中需要包含这部分代码。 用户可能需要完整的示例代码,包括导包语句、异常处理以及资源释放(关闭流)。因此,代码中应该使用try-with-resources来自动关闭文件流,确保资源的正确释放。 另外,用户的问题中提到“生成相关问题”,所以回答后需要生成几个相关问题,比如优化方法、处理大数据量、样式设置等,这些可以基于引用中的内容来设计,比如引用[4]提到的内存管理问题,引用[3]中的读取操作,引用[1]中的样式设置。 现在,我需要确保代码的正确性。例如,创建Workbook、Sheet、Row、Cell的步骤是否正确,样式设置是否正确应用。比如,创建Workbook实例时使用XSSFWorkbook,然后创建Sheet,接着创建行单元格,设置值,应用样式,最后写入文件。 可能需要注意的细节:单元格的索引是从0开始,样式对象需要通过workbook.createCellStyle()创建,字体也是如此。需要确保样式正确关联到单元格。 最后,总结步骤,分点说明,让用户清晰理解。同时,提醒用户处理异常关闭资源的重要性,可能的大文件处理问题,引用[4]的内容可以作为优化建议放在相关问题里。 现在,我需要将这些思考整理成一个结构化的回答,包含步骤说明、示例代码相关问题。确保代码语法正确,符合POI 3.5版本的API,因为引用[1]提到基于3.5版本,但用户可能使用较新版本,但基本API应该相似,不过可能需要检查是否有过时的方法。例如,创建WorkbookSheet的API是否变化不大,通常这些基本操作在版本迭代中保持稳定。 检查示例代码是否有误,比如是否正确处理了异常,是否正确使用了try-with-resources,是否正确创建了单元格样式,比如合并单元格、设置字体加粗等。 总结,回答应包括:步骤说明、示例代码、相关问题,并引用相关的引用内容作为支持。</think>### 如何使用Apache POI生成Excel文件 以下是使用Apache POI生成Excel文件的详细步骤及示例代码: --- #### **步骤说明** 1. **添加依赖** 在Maven项目的`pom.xml`中添加Apache POI依赖: ```xml <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>5.2.3</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.3</version> </dependency> ``` 2. **创建WorkbookSheet** - 使用`XSSFWorkbook`生成`.xlsx`格式文件(或`HSSFWorkbook`生成旧版`.xls`)。 - 通过`createSheet()`方法创建工作表。 3. **填充数据** - 创建行(`Row`)单元格(`Cell`),通过`setCellValue()`写入数据。 - 合并单元格使用`sheet.addMergedRegion()`。 4. **设置样式** - 定义字体(`Font`)、单元格样式(`CellStyle`),如加粗、居中对齐、背景色等。 - 将样式绑定到单元格。 5. **写入文件** 使用`FileOutputStream`将Workbook保存到本地文件。 --- #### **示例代码** ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileOutputStream; public class ExcelGenerator { public static void main(String[] args) { try (Workbook workbook = new XSSFWorkbook()) { // 1. 创建工作表 Sheet sheet = workbook.createSheet("员工信息"); // 2. 创建标题行并合并单元格 Row titleRow = sheet.createRow(0); titleRow.createCell(0).setCellValue("员工信息表"); sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 3)); // 3. 设置标题样式 CellStyle titleStyle = workbook.createCellStyle(); titleStyle.setAlignment(HorizontalAlignment.CENTER); Font titleFont = workbook.createFont(); titleFont.setBold(true); titleFont.setFontHeightInPoints((short) 16); titleStyle.setFont(titleFont); titleRow.getCell(0).setCellStyle(titleStyle); // 4. 添加表头 Row headerRow = sheet.createRow(1); String[] headers = {"姓名", "部门", "工号", "入职日期"}; CellStyle headerStyle = workbook.createCellStyle(); headerStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); for (int i = 0; i < headers.length; i++) { Cell cell = headerRow.createCell(i); cell.setCellValue(headers[i]); cell.setCellStyle(headerStyle); } // 5. 填充数据 Row dataRow = sheet.createRow(2); dataRow.createCell(0).setCellValue("张三"); dataRow.createCell(1).setCellValue("技术部"); dataRow.createCell(2).setCellValue("1001"); dataRow.createCell(3).setCellValue("2023-01-15"); // 6. 自动调整列宽 for (int i = 0; i < headers.length; i++) { sheet.autoSizeColumn(i); } // 7. 保存文件 try (FileOutputStream fos = new FileOutputStream("EmployeeData.xlsx")) { workbook.write(fos); System.out.println("Excel文件生成成功!"); } } catch (Exception e) { e.printStackTrace(); } } } ``` --- #### **关键点说明** - **Workbook类型**:`XSSFWorkbook`用于生成`.xlsx`文件,`HSSFWorkbook`用于旧版`.xls`[^5]。 - **资源释放**:使用`try-with-resources`自动关闭流,避免内存泄漏[^4]。 - **性能优化**:处理大数据量时,建议分批次写入或使用`SXSSFWorkbook`流式处理[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值