- 浏览: 58311 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
9976:
讲得很清晰详细,基本理解了~
JMS入门 -
robin35java:
这篇文章好,对于信号量进行了解释,并且扩展了线程的实现思考方式 ...
JAVA线程间通信问题 -
ds3783:
其实上述的问题总归起来还是架构设计不明确,Service层是否 ...
spring Transaction Manager和hibernate session 吐血经验谈 -
ivyloo:
好东西呀!谢谢了
JAVA基础
- public class SummaryHSSF {
- public static void main(String[] args) throws IOException {
- //创建Workbook对象(这一个对象代表着对应的一个Excel文件)
- //HSSFWorkbook表示以xls为后缀名的文件
- Workbook wb = new HSSFWorkbook();
- //获得CreationHelper对象,这个应该是一个帮助类
- CreationHelper helper = wb.getCreationHelper();
- //创建Sheet并给名字(表示Excel的一个Sheet)
- Sheet sheet1 = wb.createSheet("HSSF_Sheet_1");
- Sheet sheet2 = wb.createSheet("HSSF_Sheet_2");
- //Row表示一行Cell表示一列
- Row row = null;
- Cell cell = null;
- for(int i=0;i<60;i=i+2){
- //获得这个sheet的第i行
- row = sheet1.createRow(i);
- //设置行长度自动
- //row.setHeight((short)500);
- row.setHeightInPoints(20);
- //row.setZeroHeight(true);
- for(int j=0;j<25;j++){
- //设置每个sheet每一行的宽度,自动,根据需求自行确定
- sheet1.autoSizeColumn(j+1, true);
- //创建一个基本的样式
- CellStyle cellStyle = SummaryHSSF.createStyleCell(wb);
- //获得这一行的每j列
- cell = row.createCell(j);
- if(j==0){
- //设置文字在单元格里面的位置
- cellStyle = SummaryHSSF.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER);
- //先创建字体样式,并把这个样式加到单元格的字体里面
- cellStyle.setFont(createFonts(wb));
- //把这个样式加到单元格里面
- cell.setCellStyle(cellStyle);
- //给单元格设值
- cell.setCellValue(true);
- }else if(j==1){
- //设置文字在单元格里面的位置
- cellStyle = SummaryHSSF.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER);
- //设置这个样式的格式(Format)
- cellStyle = SummaryHSSF.setCellFormat(helper,cellStyle, "#,##0.0000");
- //先创建字体样式,并把这个样式加到单元格的字体里面
- cellStyle.setFont(createFonts(wb));
- //把这个样式加到单元格里面
- cell.setCellStyle(cellStyle);
- //给单元格设值
- cell.setCellValue(new Double(2008.2008));
- }else if(j==2){
- cellStyle = SummaryHSSF.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER);
- cellStyle.setFont(createFonts(wb));
- cell.setCellStyle(cellStyle);
- cell.setCellValue(helper.createRichTextString("RichString"+i+j));
- }else if(j==3){
- cellStyle = SummaryHSSF.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER);
- cellStyle = SummaryHSSF.setCellFormat(helper,cellStyle, "MM-yyyy-dd");
- cell.setCellStyle(cellStyle);
- cell.setCellValue(new Date());
- }else if(j==24){
- cellStyle = SummaryHSSF.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER);
- cellStyle.setFont(createFonts(wb));
- //设置公式
- cell.setCellFormula("SUM(E"+(i+1)+":X"+(i+1)+")");
- }else{
- cellStyle = SummaryHSSF.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER);
- cellStyle = SummaryHSSF.setFillBackgroundColors(cellStyle,IndexedColors.ORANGE.getIndex(),IndexedColors.ORANGE.getIndex(),CellStyle.SOLID_FOREGROUND);
- cell.setCellStyle(cellStyle);
- cell.setCellValue(1);
- }
- }
- }
- //输出
- OutputStream os = new FileOutputStream(new File("c://SummaryHSSF.xls"));
- wb.write(os);
- os.close();
- }
- /**
- * 边框
- * @param wb
- * @return
- */
- public static CellStyle createStyleCell(Workbook wb){
- CellStyle cellStyle = wb.createCellStyle();
- //设置一个单元格边框颜色
- cellStyle.setBorderBottom(CellStyle.BORDER_THIN);
- cellStyle.setBorderTop(CellStyle.BORDER_THIN);
- cellStyle.setBorderLeft(CellStyle.BORDER_THIN);
- cellStyle.setBorderRight(CellStyle.BORDER_THIN);
- //设置一个单元格边框颜色
- cellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());
- cellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());
- cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());
- cellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());
- return cellStyle;
- }
- /**
- * 设置文字在单元格里面的位置
- * CellStyle.ALIGN_CENTER
- * CellStyle.VERTICAL_CENTER
- * @param cellStyle
- * @param halign
- * @param valign
- * @return
- */
- public static CellStyle setCellStyleAlignment(CellStyle cellStyle,short halign,short valign){
- //设置上下
- cellStyle.setAlignment(CellStyle.ALIGN_CENTER);
- //设置左右
- cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
- return cellStyle;
- }
- /**
- * 格式化单元格
- * 如#,##0.00,m/d/yy去HSSFDataFormat或XSSFDataFormat里面找
- * @param cellStyle
- * @param fmt
- * @return
- */
- public static CellStyle setCellFormat(CreationHelper helper,CellStyle cellStyle,String fmt){
- //还可以用其它方法创建format
- cellStyle.setDataFormat(helper.createDataFormat().getFormat(fmt));
- return cellStyle;
- }
- /**
- * 前景和背景填充的着色
- * @param cellStyle
- * @param bg IndexedColors.ORANGE.getIndex();
- * @param fg IndexedColors.ORANGE.getIndex();
- * @param fp CellStyle.SOLID_FOREGROUND
- * @return
- */
- public static CellStyle setFillBackgroundColors(CellStyle cellStyle,short bg,short fg,short fp){
- //cellStyle.setFillBackgroundColor(bg);
- cellStyle.setFillForegroundColor(fg);
- cellStyle.setFillPattern(fp);
- return cellStyle;
- }
- /**
- * 设置字体
- * @param wb
- * @return
- */
- public static Font createFonts(Workbook wb){
- //创建Font对象
- Font font = wb.createFont();
- //设置字体
- font.setFontName("黑体");
- //着色
- font.setColor(HSSFColor.BLUE.index);
- //斜体
- font.setItalic(true);
- //字体大小
- font.setFontHeight((short)300);
- return font;
- }
- }
public class SummaryHSSF { public static void main(String[] args) throws IOException { //创建Workbook对象(这一个对象代表着对应的一个Excel文件) //HSSFWorkbook表示以xls为后缀名的文件 Workbook wb = new HSSFWorkbook(); //获得CreationHelper对象,这个应该是一个帮助类 CreationHelper helper = wb.getCreationHelper(); //创建Sheet并给名字(表示Excel的一个Sheet) Sheet sheet1 = wb.createSheet("HSSF_Sheet_1"); Sheet sheet2 = wb.createSheet("HSSF_Sheet_2"); //Row表示一行Cell表示一列 Row row = null; Cell cell = null; for(int i=0;i<60;i=i+2){ //获得这个sheet的第i行 row = sheet1.createRow(i); //设置行长度自动 //row.setHeight((short)500); row.setHeightInPoints(20); //row.setZeroHeight(true); for(int j=0;j<25;j++){ //设置每个sheet每一行的宽度,自动,根据需求自行确定 sheet1.autoSizeColumn(j+1, true); //创建一个基本的样式 CellStyle cellStyle = SummaryHSSF.createStyleCell(wb); //获得这一行的每j列 cell = row.createCell(j); if(j==0){ //设置文字在单元格里面的位置 cellStyle = SummaryHSSF.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER); //先创建字体样式,并把这个样式加到单元格的字体里面 cellStyle.setFont(createFonts(wb)); //把这个样式加到单元格里面 cell.setCellStyle(cellStyle); //给单元格设值 cell.setCellValue(true); }else if(j==1){ //设置文字在单元格里面的位置 cellStyle = SummaryHSSF.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER); //设置这个样式的格式(Format) cellStyle = SummaryHSSF.setCellFormat(helper,cellStyle, "#,##0.0000"); //先创建字体样式,并把这个样式加到单元格的字体里面 cellStyle.setFont(createFonts(wb)); //把这个样式加到单元格里面 cell.setCellStyle(cellStyle); //给单元格设值 cell.setCellValue(new Double(2008.2008)); }else if(j==2){ cellStyle = SummaryHSSF.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER); cellStyle.setFont(createFonts(wb)); cell.setCellStyle(cellStyle); cell.setCellValue(helper.createRichTextString("RichString"+i+j)); }else if(j==3){ cellStyle = SummaryHSSF.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER); cellStyle = SummaryHSSF.setCellFormat(helper,cellStyle, "MM-yyyy-dd"); cell.setCellStyle(cellStyle); cell.setCellValue(new Date()); }else if(j==24){ cellStyle = SummaryHSSF.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER); cellStyle.setFont(createFonts(wb)); //设置公式 cell.setCellFormula("SUM(E"+(i+1)+":X"+(i+1)+")"); }else{ cellStyle = SummaryHSSF.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER); cellStyle = SummaryHSSF.setFillBackgroundColors(cellStyle,IndexedColors.ORANGE.getIndex(),IndexedColors.ORANGE.getIndex(),CellStyle.SOLID_FOREGROUND); cell.setCellStyle(cellStyle); cell.setCellValue(1); } } } //输出 OutputStream os = new FileOutputStream(new File("c://SummaryHSSF.xls")); wb.write(os); os.close(); } /** * 边框 * @param wb * @return */ public static CellStyle createStyleCell(Workbook wb){ CellStyle cellStyle = wb.createCellStyle(); //设置一个单元格边框颜色 cellStyle.setBorderBottom(CellStyle.BORDER_THIN); cellStyle.setBorderTop(CellStyle.BORDER_THIN); cellStyle.setBorderLeft(CellStyle.BORDER_THIN); cellStyle.setBorderRight(CellStyle.BORDER_THIN); //设置一个单元格边框颜色 cellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex()); cellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex()); cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex()); cellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex()); return cellStyle; } /** * 设置文字在单元格里面的位置 * CellStyle.ALIGN_CENTER * CellStyle.VERTICAL_CENTER * @param cellStyle * @param halign * @param valign * @return */ public static CellStyle setCellStyleAlignment(CellStyle cellStyle,short halign,short valign){ //设置上下 cellStyle.setAlignment(CellStyle.ALIGN_CENTER); //设置左右 cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER); return cellStyle; } /** * 格式化单元格 * 如#,##0.00,m/d/yy去HSSFDataFormat或XSSFDataFormat里面找 * @param cellStyle * @param fmt * @return */ public static CellStyle setCellFormat(CreationHelper helper,CellStyle cellStyle,String fmt){ //还可以用其它方法创建format cellStyle.setDataFormat(helper.createDataFormat().getFormat(fmt)); return cellStyle; } /** * 前景和背景填充的着色 * @param cellStyle * @param bg IndexedColors.ORANGE.getIndex(); * @param fg IndexedColors.ORANGE.getIndex(); * @param fp CellStyle.SOLID_FOREGROUND * @return */ public static CellStyle setFillBackgroundColors(CellStyle cellStyle,short bg,short fg,short fp){ //cellStyle.setFillBackgroundColor(bg); cellStyle.setFillForegroundColor(fg); cellStyle.setFillPattern(fp); return cellStyle; } /** * 设置字体 * @param wb * @return */ public static Font createFonts(Workbook wb){ //创建Font对象 Font font = wb.createFont(); //设置字体 font.setFontName("黑体"); //着色 font.setColor(HSSFColor.BLUE.index); //斜体 font.setItalic(true); //字体大小 font.setFontHeight((short)300); return font; } }
读取Excel文件
- public class ReadExcel {
- public static void main(String[] args) throws Exception {
- InputStream is = new FileInputStream(new File("c://SummaryHSSF.xls"));
- //根据输入流创建Workbook对象
- Workbook wb = WorkbookFactory.create(is);
- //get到Sheet对象
- Sheet sheet = wb.getSheetAt(0);
- //这个必须用接口
- for(Row row : sheet){
- for(Cell cell : row){
- //cell.getCellType是获得cell里面保存的值的type
- //如Cell.CELL_TYPE_STRING
- switch(cell.getCellType()){
- case Cell.CELL_TYPE_BOOLEAN:
- //得到Boolean对象的方法
- System.out.print(cell.getBooleanCellValue()+" ");
- break;
- case Cell.CELL_TYPE_NUMERIC:
- //先看是否是日期格式
- if(DateUtil.isCellDateFormatted(cell)){
- //读取日期格式
- System.out.print(cell.getDateCellValue()+" ");
- }else{
- //读取数字
- System.out.print(cell.getNumericCellValue()+" ");
- }
- break;
- case Cell.CELL_TYPE_FORMULA:
- //读取公式
- System.out.print(cell.getCellFormula()+" ");
- break;
- case Cell.CELL_TYPE_STRING:
- //读取String
- System.out.print(cell.getRichStringCellValue().toString()+" ");
- break;
- }
- }
- System.out.println("");
- }
- }
- }
public class ReadExcel { public static void main(String[] args) throws Exception { InputStream is = new FileInputStream(new File("c://SummaryHSSF.xls")); //根据输入流创建Workbook对象 Workbook wb = WorkbookFactory.create(is); //get到Sheet对象 Sheet sheet = wb.getSheetAt(0); //这个必须用接口 for(Row row : sheet){ for(Cell cell : row){ //cell.getCellType是获得cell里面保存的值的type //如Cell.CELL_TYPE_STRING switch(cell.getCellType()){ case Cell.CELL_TYPE_BOOLEAN: //得到Boolean对象的方法 System.out.print(cell.getBooleanCellValue()+" "); break; case Cell.CELL_TYPE_NUMERIC: //先看是否是日期格式 if(DateUtil.isCellDateFormatted(cell)){ //读取日期格式 System.out.print(cell.getDateCellValue()+" "); }else{ //读取数字 System.out.print(cell.getNumericCellValue()+" "); } break; case Cell.CELL_TYPE_FORMULA: //读取公式 System.out.print(cell.getCellFormula()+" "); break; case Cell.CELL_TYPE_STRING: //读取String System.out.print(cell.getRichStringCellValue().toString()+" "); break; } } System.out.println(""); } } }
还有一种传统的读法
- Sheet sheet = wb.getSheetAt(0);
- for (Iterator rit = sheet.rowIterator(); rit.hasNext(); ) {
- Row row = (Row)rit.next();
- for (Iterator cit = row.cellIterator(); cit.hasNext(); ) {
- Cell cell = (Cell)cit.next();
- // Do something here
- }
- }
- HSSFSheet sheet = wb.getSheetAt(0);
- for (Iterator<HSSFRow> rit = (Iterator<HSSFRow>)sheet.rowIterator(); rit.hasNext(); ) {
- HSSFRow row = rit.next();
- for (Iterator<HSSFCell> cit = (Iterator<HSSFCell>)row.cellIterator(); cit.hasNext(); ) {
- HSSFCell cell = cit.next();
- // Do something here
- }
- }
Sheet sheet = wb.getSheetAt(0); for (Iterator rit = sheet.rowIterator(); rit.hasNext(); ) { Row row = (Row)rit.next(); for (Iterator cit = row.cellIterator(); cit.hasNext(); ) { Cell cell = (Cell)cit.next(); // Do something here } } HSSFSheet sheet = wb.getSheetAt(0); for (Iterator<HSSFRow> rit = (Iterator<HSSFRow>)sheet.rowIterator(); rit.hasNext(); ) { HSSFRow row = rit.next(); for (Iterator<HSSFCell> cit = (Iterator<HSSFCell>)row.cellIterator(); cit.hasNext(); ) { HSSFCell cell = cit.next(); // Do something here } }
发表评论
-
spring Transaction Manager和hibernate session 吐血经验谈
2009-04-23 20:59 2788spring Transaction Manager和hibe ... -
JAVA线程间通信问题
2009-04-23 17:51 8345问题 在前一小节,介绍了在多线程编程中使用同步机制的重要性, ... -
JMS
2009-04-23 10:41 1730JMS编程知识 关键字: jms ... -
Spring AOP 2
2009-04-11 14:18 914Spring AOP高级篇(自动 ... -
Spring AOP
2009-04-11 14:17 1010Spring AOP(2008-12-19 20:23:5 ... -
apache+tomcat配置
2009-04-10 17:48 2392apache+tomcat配置[转] 2007-10-27 ... -
apache+tomcat集群配置
2009-04-10 17:06 6914APACHE 2.2.8+TOMCAT6.0.14配置负载均衡 ... -
JMS 消息头
2009-04-09 23:28 2632深入掌握JMS(六):消息头 2009年03月31日 星期二 ... -
JMS topic
2009-04-09 23:26 3943深入掌握J ... -
深入掌握JMS(四):实战Queue
2009-04-09 23:24 2038Queue实现的是点到点模型,在下面的例子中,启动2个消费者共 ... -
深入掌握JMS(三):MessageListener
2009-04-09 23:22 55772009年03月31日 星期二 09:41 ... -
JMS例子
2009-04-09 23:19 3808深入掌握JMS(二):一个JMS例子 2009年03月31日 ... -
JMS入门
2009-04-09 23:17 21121. JMS基本概念 JMS( ... -
rmi 入门
2009-04-09 23:09 1183转]RMI实例入门(2009-02-26 ... -
java 23种模式代码
2009-04-09 02:07 148623种设计模式的代码版(Java) Posted on ... -
JAVA基础
2009-04-08 01:22 13691 【JAVA】JAVA相关基础知识 ... -
抽象工厂模式代码
2009-03-27 01:12 4146爪哇语言抽象工厂创立性模式介绍 工厂模 ... -
spring 事务传播机制
2009-03-26 19:29 1345Spring事务传播机制 PROPAG ... -
Spring声明式事务管理源码解读之事务提交
2009-03-26 19:27 1403/** *作者:张荣华(ahuaxuan) *2007-0 ...
相关推荐
标题中的“poi操作excel案例”指的是使用Apache POI库来处理Excel文件的示例项目。Apache POI是一个开源的Java库,它允许开发者创建、修改和显示Microsoft Office格式的文件,包括Excel工作簿(XLS和XLSX)。在这个...
这篇博客文章“POI操作Excel常用方法总结”可能详细介绍了如何利用Apache POI库在Java环境中读写Excel文件。以下是对该主题的一些关键知识点的详细说明: 1. **Apache POI介绍**: Apache POI是开源项目,提供了...
"poi操作excel所需完整jar包"指的是包含了所有必要组件的Apache POI库,这样在导入IDE并添加到构建路径后,就可以避免出现`NoClassDefFoundError`这样的运行时错误。 Apache POI 提供了丰富的API,允许开发者读取、...
Apache POI是一个强大的Java库,专门用于处理...通过lib.rar和Poi02.rar中的示例代码,你可以更深入地了解和学习POI操作Excel的具体实现。在实践中,结合这些资源,你将能够熟练地在Java Web项目中集成Excel处理功能。
标题中的"java通过poi操作excel jar包"指的是使用Apache POI库来处理Excel文件的Java程序,通常需要引入特定版本的POI JAR包。在这个案例中,我们有两个版本的JAR包可供使用:poi_3.17.jar和poi_3.15.jar。这些版本...
在“poi操作excel表格导入和导出”这个主题中,我们将深入探讨如何利用Apache POI进行Excel数据的处理,包括导入和导出。 一、Apache POI简介 Apache POI是一个开源项目,它提供了API来处理Microsoft Office格式的...
这个"poi操作excel的Demo"很可能是提供了一个使用Apache POI库来读取、写入或修改Excel文件的示例代码。下面将详细介绍Apache POI在处理Excel时的一些关键知识点。 1. **Apache POI概述**: Apache POI 是Java平台...
在这个场景中,"POI操作Excel的封装"指的是对POI API进行的高级抽象和简化,以便于开发人员更方便地处理Excel文件。通过反射和约定,可以创建一个易于使用的API,隐藏底层复杂的POI细节。 反射是Java编程语言中的一...
二、Java POI操作Excel的核心功能 1. 创建新的Excel工作簿 使用`WorkbookFactory.create()`方法可以创建一个新的Excel工作簿对象,然后通过工作簿对象创建工作表。 2. 读取Excel工作簿 同样,使用`WorkbookFactory....
poi操作excel所需jar包及poi源码 包含内容 poi-3.7.jar poi-ooxml-3.7.jar poi-ooxml-schemas-3.7.jar poi-scratchpad-3.7.jar Lib-->commons-logging-1.1.jar lib-->junit-3.8.1.jar lib-->log4j.1.2.13.jar ooxml-...
"poi操作Excel文件jar包"指的是包含Apache POI库的Java归档(JAR)文件,可以集成到Java项目中以实现Excel文件的处理功能。 1. **Apache POI 简介** Apache POI 是Apache软件基金会的一个顶级项目,最初由Markus ...
接下来,我们将讨论如何使用Apache POI操作Excel 2007(.xlsx)文件的主要步骤: 1. **创建Workbook对象**:这是Excel工作簿的Java表示。你可以使用`XSSFWorkbook`类来创建一个新的Excel工作簿。 ```java import...
这个“POI操作excel的JAR包”是Apache POI项目的一部分,它提供了一系列API,使得Java开发者可以方便地创建、读取、修改Excel电子表格。 在Java开发中,使用Apache POI库可以实现以下功能: 1. **创建Excel工作簿*...
"poi操作excel全部jar包"指的是使用Apache POI进行Excel操作所需的所有库文件集合,通常包含多个JAR文件,每个文件服务于不同的功能模块。 Apache POI 主要分为三个部分: 1. **HSSF**: 这是处理Microsoft Excel的...
Java中的Apache POI库是处理...以上是Java POI操作Excel的基本概念和关键点,理解并熟练运用这些知识点,你就可以在项目中高效地进行批量导入导出操作了。记住,持续学习和适应新的库版本是保持技术领先的关键。
使用POI操作Excel调用高德地图API操作Excel示例
"poi操作excel的jar包集.rar"文件包含了运行Apache POI库所需的全部依赖,让你能够无缝进行Excel文件的操作,无论是2003的老版本还是2007及以后的新版本。 首先,我们需要理解Apache POI的主要组件: 1. **HSSF...
这个"POI操作Excel总结实例"的资料可能包含了一系列示例代码,教你如何利用Apache POI库来读取、写入和操作Excel文件。下面,我将详细讲解关于POI操作Excel的一些关键知识点。 1. **创建Excel工作簿(Workbook)** ...
在这个场景中,我们关注的是如何使用 POI 操作 Excel 工具类。这个工具类可以帮助开发者在 Java 环境下读写 Excel 文件,从而实现数据导入、导出等功能。下面将详细介绍 POI 操作 Excel 的关键知识点。 1. **工作簿...