精华内容
下载资源
问答
  • 使用jxls框架生成Excel,简单易懂。内含所使用的引用jar包版本。
  • 主要介绍了Java基础开发之数据导出Excel文件格式实例详解,需要的朋友可以参考下
  • Java生成 excel 并导出文件

    千次阅读 2018-07-12 14:17:24
    目前,比较常用的实现Java导入、导出Excel的技术有两种Jakarta POI和Java Excel下面我就分别讲解一下如何使用这两个技术实现导入、导出Excel二、使用Jakarta POI导入、导出ExcelJakarta POI 是一套用于访问微软格式...

    目前,比较常用的实现Java导入、导出Excel的技术有两种Jakarta POI和Java Excel

    下面我就分别讲解一下如何使用这两个技术实现导入、导出Excel

    二、使用Jakarta POI导入、导出Excel

    Jakarta POI 是一套用于访问微软格式文档的Java API。Jakarta POI有很多组件组成,其中有用于操作Excel格式文件的HSSF和用于操作Word的HWPF,在各种组件中目前只有用于操作Excel的HSSF相对成熟。官方主页http://poi.apache.org/index.html,API文档http://poi.apache.org/apidocs/index.html

    2.1 环境配置

    2.1.1下载jar

    官方下载:http://poi.apache.org/download.html这里可以下载到它的最新版本和文档,目前最新版本是3.7,这里使用比较稳定的3.6版。

    2.1.2加入jar包

    将根目录下的poi-3.6-20091214.jar和Lib目录下三个通用包 commons-logging-1.1.jar junit-3.8.1.jar log4j-1.2.13.jar拷贝到项目的Lib下

    2.2 Jakarta POI HSSF API组件

    HSSF(用于操作Excel的组件)提供给用户使用的对象在rg.apache.poi.hssf.usermodel包中,主要部分包括Excel对象,样式和格式,还有辅助操作。有以下几种对象: 

    常用组件:

    HSSFWorkbook                      excel的文档对象

    HSSFSheet                         excel的表单

    HSSFRow                           excel的行

    HSSFCell                          excel的格子单元

    HSSFFont                          excel字体

    HSSFDataFormat                    日期格式

    HSSFHeader                        sheet头

    HSSFFooter                        sheet尾(只有打印的时候才能看到效果)

    样式:

    HSSFCellStyle                       cell样式

    辅助操作包括:

    HSSFDateUtil                        日期

    HSSFPrintSetup                      打印

    HSSFErrorConstants                  错误信息表

    2.3 基本操作步骤

    首先,理解一下一个Excel的文件的组织形式,一个Excel文件对应于一个workbook(HSSFWorkbook),一个workbook可以有多个sheet(HSSFSheet)组成,一个sheet是由多个row(HSSFRow)组成,一个row是由多个cell(HSSFCell)组成。

    基本操作步骤:

    1、用HSSFWorkbook打开或者创建“Excel文件对象”

    2、用HSSFWorkbook对象返回或者创建Sheet对象

    3、用Sheet对象返回行对象,用行对象得到Cell对象

    4、对Cell对象读写。

    下面来看一个动态生成Excel文件的例子:

     
    1. //创建HSSFWorkbook对象
    2. HSSFWorkbook wb = new HSSFWorkbook();
    3. //创建HSSFSheet对象
    4. HSSFSheet sheet = wb.createSheet( "sheet0");
    5. //创建HSSFRow对象
    6. HSSFRow row = sheet.createRow( 0);
    7. //创建HSSFCell对象
    8. HSSFCell cell=row.createCell( 0);
    9. //设置单元格的值
    10. cell.setCellValue( "单元格中的中文");
    11. //输出Excel文件
    12. FileOutputStream output= new FileOutputStream( "d:\\workbook.xls");
    13. wkb.write(output);
    14. output.flush();

    HSSF读取文件同样还是使用这几个对象,只是把相应的createXXX方法变成了getXXX方法即可。可见只要理解了其中原理,不管是读还是写亦或是特定格式都可以轻松实现,正所谓知其然更要知其所以然。

    2.4 导出Excel应用实例

     在2.3中我们寥寥几行代码实际上就已经就是实现了导出Excel一个简单示例,下面我们在看如何实现导出如图所示的Excel表格?

    代码如下:(实际开发中应封装到业务层组件中,然后在控制层中调用。这里直接写在控制层组件,如Servlet的doGet/doPost方法或Struts框架的execute方法中)

     
    1. //创建HSSFWorkbook对象(excel的文档对象)
    2. HSSFWorkbook wb = new HSSFWorkbook();
    3. //建立新的sheet对象(excel的表单)
    4. HSSFSheet sheet=wkb.createSheet( "成绩表");
    5. //在sheet里创建第一行,参数为行索引(excel的行),可以是0~65535之间的任何一个
    6. HSSFRow row1=sheet.createRow( 0);
    7. //创建单元格(excel的单元格,参数为列索引,可以是0~255之间的任何一个
    8. HSSFCell cell=row1.createCell( 0);
    9. //设置单元格内容
    10. cell.setCellValue( "学员考试成绩一览表");
    11. //合并单元格CellRangeAddress构造参数依次表示起始行,截至行,起始列, 截至列
    12. sheet.addMergedRegion( new CellRangeAddress( 0, 0, 0, 3));
    13. //在sheet里创建第二行
    14. HSSFRow row2=sheet.createRow( 1);
    15. //创建单元格并设置单元格内容
    16. row2.createCell( 0).setCellValue( "姓名");
    17. row2.createCell( 1).setCellValue( "班级");
    18. row2.createCell( 2).setCellValue( "笔试成绩");
    19. row2.createCell( 3).setCellValue( "机试成绩");
    20. //在sheet里创建第三行
    21. HSSFRow row3=sheet.createRow( 2);
    22. row3.createCell( 0).setCellValue( "李明");
    23. row3.createCell( 1).setCellValue( "As178");
    24. row3.createCell( 2).setCellValue( 87);
    25. row3.createCell( 3).setCellValue( 78);
    26. //.....省略部分代码
    27. //输出Excel文件
    28. OutputStream output=response.getOutputStream();
    29. response.reset();
    30. response.setHeader( "Content-disposition", "attachment; filename=details.xls");
    31. response.setContentType( "application/msexcel");
    32. wkb.write(output);
    33. output.close();
    34. retrun null;

    加下划线这部分代码是B/S模式中采用的输出方式,而不是输出到本地指定的磁盘目录。该代码表示将details.xls的Excel文件通过应答实体(response)输出给请求的客户端浏览器,客户端可保存或直接打开。

    2.5 样式设置

    在实际应用中导出的Excel文件往往需要阅读和打印的,这就需要对输出的Excel文档进行排版和样式的设置,主要操作有合并单元格、设置单元格样式、设置字体样式等。

    2.5.1单元格合并

        使用HSSFSheet的addMergedRegion()方法

     
    public int addMergedRegion(CellRangeAddress region)

        参数CellRangeAddress 表示合并的区域,构造方法如下:

     
    CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol)

    构造参数依次表示起始行,截至行,起始列, 截至列。示例代码参照2.4部分

    2.5.2设置单元格的行高、列宽

     
    1. HSSFSheet sheet=wb.createSheet();
    2. sheet.setDefaultRowHeightInPoints( 10); //设置缺省列高sheet.setDefaultColumnWidth(20);//设置缺省列宽
    3. //设置指定列的列宽,256 * 50这种写法是因为width参数单位是单个字符的256分之一
    4. sheet.setColumnWidth(cell.getColumnIndex(), 256 * 50);

    2.5.2单元格样式

    1、创建HSSFCellStyle

     
     HSSFCellStyle cellStyle=wkb.createCellStyle()

    2、设置样式

     
    1. // 设置单元格的横向和纵向对齐方式,具体参数就不列了,参考HSSFCellStyle
    2. cellStyle.setAlignment(HSSFCellStyle.ALIGN_JUSTIFY);
    3. cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
    4. /* 设置单元格的填充方式,以及前景颜色和背景颜色
    5. 三点注意:
    6. 1.如果需要前景颜色或背景颜色,一定要指定填充方式,两者顺序无所谓;
    7. 2.如果同时存在前景颜色和背景颜色,前景颜色的设置要写在前面;
    8. 3.前景颜色不是字体颜色。
    9. */
    10. //设置填充方式(填充图案)
    11. cellStyle.setFillPattern(HSSFCellStyle.DIAMONDS);
    12. //设置前景色
    13. cellStyle.setFillForegroundColor(HSSFColor.RED.index);
    14. //设置背景颜色
    15. cellStyle.setFillBackgroundColor(HSSFColor.LIGHT_YELLOW.index);
    16. // 设置单元格底部的边框及其样式和颜色
    17. // 这里仅设置了底边边框,左边框、右边框和顶边框同理可设
    18. cellStyle.setBorderBottom(HSSFCellStyle.BORDER_SLANTED_DASH_DOT);
    19. cellStyle.setBottomBorderColor(HSSFColor.DARK_RED.index);
    20. //设置日期型数据的显示样式
    21. cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat( "m/d/yy h:mm"));

    3、将样式应用于单元格

     
    1. cell.setCellStyle(cellStyle);
    2. //将样式应用到行,但有些样式只对单元格起作用
    3. row.setRowStyle(cellStyle);

    2.5.2设置字体样式

    1、创建HSSFFont对象(调用HSSFWorkbook 的createFont方法)

     
    1. HSSFWorkbook wb= new HSSFWorkbook();
    2. HSSFFont fontStyle=wb.createFont();
    3. HSSFWorkbook wb= new HSSFWorkbook ();

    2、设置字体各种样式

     
    1. //设置字体样式
    2. fontStyle.setFontName( "宋体");
    3. //设置字体高度
    4. fontStyle.setFontHeightInPoints(( short) 20);
    5. //设置字体颜色
    6. font.setColor(HSSFColor.BLUE.index);
    7. //设置粗体
    8. fontStyle.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
    9. //设置斜体
    10. font.setItalic( true);
    11. //设置下划线
    12. font.setUnderline(HSSFFont.U_SINGLE);

    3、将字体设置到单元格样式

    1. //字体也是单元格格式的一部分,所以从属于HSSFCellStyle
    2. // 将字体对象赋值给单元格样式对象
    3. cellStyle.setFont(font);
    4. // 将单元格样式应用于单元格
    5. cell.setCellStyle(cellStyle);


    
    

    2.6 导入Excel应用实例

    实现将已存在的Excel文件中的数据导入到系统中的基本步骤同导出十分的类似,关键在于要了解要导入Excel文件的结构,比如数据有哪些列、读取数据起始位置(有效数据从第几行几列开始)等。在实际项目中由于这些数据(Excel文件)往往来自于日常办公人员或其他系统平台产生的业务数据,因此这些Excel文件的数据格式要有统一的要求,并提供访问接口(指访问途径),这样在所需数据的系统中就可通过提供这个访问接口调用方法,从而获得数据。解决方案采用Web Service是不错的选择。这里,我们就以导入2..4所产生的excel表为例,重点掌握如何编写导入Excel代码

     
    1. public List<ScoreInfo> loadScoreInfo(String xlsPath) throws IOException{
    2. List temp = new ArrayList();
    3. FileInputStream fileIn = new FileInputStream(xlsPath);
    4. //根据指定的文件输入流导入Excel从而产生Workbook对象
    5. Workbook wb0 = new HSSFWorkbook(fileIn);
    6. //获取Excel文档中的第一个表单
    7. Sheet sht0 = wb0.getSheetAt( 0);
    8. //对Sheet中的每一行进行迭代
    9. for (Row r : sht0) {
    10. //如果当前行的行号(从0开始)未达到2(第三行)则从新循环
    11. If(r.getRowNum()< 1){
    12. continue;
    13. }
    14. //创建实体类
    15. ScoreInfo info= new ScoreInfo();
    16. //取出当前行第1个单元格数据,并封装在info实体stuName属性上
    17. info.setStuName(r.getCell( 0).getStringCellValue());
    18. info.setClassName(r.getCell( 1).getStringCellValue());
    19. info.setRscore(r.getCell( 2).getNumericCellValue());
    20. info.setLscore(r.getCell( 3).getNumericCellValue());
    21. temp.add(info);
    22. }
    23. fileIn.close();
    24. return temp;
    25. }
    三、使用java Excel操作Excel文件

      Java Excel是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容、创建新的Excel文件、更新已经存在的Excel文件。jxl 由于其小巧 易用的特点, 逐渐已经取代了 POI-excel的地位, 成为了越来越多的java开发人员生成excel文件的首选。Java  Excel的特征:

    ● 支持Excel 95-2000的所有版本 
             ● 生成Excel 2000标准格式 
             ● 支持字体、数字、日期格式化操作 
             ● 支持对单元格加阴影和加色彩;

    ● 修改存在的工作表;
             ● 支持图像和图表

    ● 日志记录可以定制

    ● 更小更快更省内存

    应该说以上功能已经能够大致满足我们的需要。最关键的是这套API是纯Java的,并不依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件。另外需要说明的是,这套API对图形和图表的支持很有限,而且仅仅识别PNG格式。在线帮助文档http://jexcelapi.sourceforge.net/resources/javadocs/2_6_10/docs/index.html

    在这里我们将通过一些实例,学习掌握读取、新建、更新,其中也包括常见格式的设置:字体、颜色、背景、合并单元格等操作,有这些其实已经基本足够应付大部分问题了。

    3.1环境配置

    3.1.1下载

    下载地址    http://www.andykhan.com/jexcelapi/

    3.1.2 加入jar包

    将jxl.jar拷贝到项目的Lib下

    3.2 使用Java Excel Api 导出 Excel文件

    下面我们在看如何使用Java Excel实现导出Excel表格?

    代码如下:(实际开发中应封装到业务层组件中,然后在控制层中调用。这里直接写在控制层组件,如Servlet的doGet/doPost方法或Struts框架的execute方法中)

    1. //获得输出流,该输出流的输出介质是客户端浏览器
    2. OutputStream output=response.getOutputStream();
    3. response.reset();
    4. response.setHeader( "Content-disposition", "attachment; filename=temp.xls");
    5. response.setContentType( "application/msexcel");
    6. //创建可写入的Excel工作薄,且内容将写入到输出流,并通过输出流输出给客户端浏览
    7. WritableWorkbook wk=Workbook.createWorkbook(output);
    8. ///创建可写入的Excel工作表
    9. WritableSheet sheet=wk.createSheet( "成绩表", 0);
    10. //把单元格(column, row)到单元格(column1, row1)进行合并。
    11. //mergeCells(column, row, column1, row1);
    12. sheet.mergeCells( 0, 0, 4, 0); //单元格合并方法
    13. //创建WritableFont 字体对象,参数依次表示黑体、字号12、粗体、非斜体、不带下划线、亮蓝色
    14. WritableFont titleFont= new WritableFont(WritableFont.createFont( "黑体"), 12,WritableFont.BOLD, false,UnderlineStyle.NO_UNDERLINE,Colour.LIGHT_BLUE);
    15. //创建WritableCellFormat对象,将该对象应用于单元格从而设置单元格的样式
    16. WritableCellFormat titleFormat= new WritableCellFormat();
    17. //设置字体格式
    18. titleFormat.setFont(titleFont);
    19. //设置文本水平居中对齐
    20. titleFormat.setAlignment(Alignment.CENTRE);
    21. //设置文本垂直居中对齐
    22. titleFormat.setVerticalAlignment(VerticalAlignment.CENTRE);
    23. //设置背景颜色
    24. titleFormat.setBackground(Colour.GRAY_25);
    25. //设置自动换行
    26. titleFormat.setWrap( true);
    27. //添加Label对象,参数依次表示在第一列,第一行,内容,使用的格式
    28. Label lab_00= new Label( 0, 0, "学员考试成绩一览表",titleFormat);
    29. //将定义好的Label对象添加到工作表上,这样工作表的第一列第一行的内容为‘学员考试成绩一览表’并应用了titleFormat定义的样式
    30. sheet.addCell(lab_00);
    31. WritableCellFormat cloumnTitleFormat= new WritableCellFormat();
    32. cloumnTitleFormat.setFont( new WritableFont(WritableFont.createFont( "宋体"), 10,WritableFont.BOLD, false));
    33. cloumnTitleFormat.setAlignment(Alignment.CENTRE);
    34. Label lab_01= new Label( 0, 1, "姓名",cloumnTitleFormat);
    35. Label lab_11= new Label( 1, 1, "班级",cloumnTitleFormat);
    36. Label lab_21= new Label( 2, 1, "笔试成绩",cloumnTitleFormat);
    37. Label lab_31= new Label( 3, 1, "上机成绩",cloumnTitleFormat);
    38. Label lab_41= new Label( 4, 1, "考试日期",cloumnTitleFormat);
    39. sheet.addCell(lab_01);
    40. sheet.addCell(lab_11);
    41. sheet.addCell(lab_21);
    42. sheet.addCell(lab_31);
    43. sheet.addCell(lab_41);
    44. sheet.addCell( new Label( 0, 2, "李明"));
    45. sheet.addCell( new Label( 1, 2, "As178"));
    46. //定义数字格式
    47. NumberFormat nf= new NumberFormat( "0.00");
    48. WritableCellFormat wcf= new WritableCellFormat(nf);
    49. //类似于Label对象,区别Label表示文本数据,Number表示数值型数据
    50. Number numlab_22= new Number( 2, 2, 78,wcf);
    51. sheet.addCell(numlab_22);
    52. sheet.addCell(newNumber( 3, 2, 87, new WritableCellFormat( new NumberFormat( "#.##") )));
    53. //定义日期格式
    54. DateFormat df= new DateFormat( "yyyy-MM-dd hh:mm:ss");
    55. //创建WritableCellFormat对象
    56. WritableCellFormat datewcf= new WritableCellFormat(df);
    57. //类似于Label对象,区别Label表示文本数据,DateTime表示日期型数据
    58. DateTime dtLab_42= new DateTime( 4, 2, new Date(),datewcf);
    59. sheet.addCell(dtLab_42);
    60. //将定义的工作表输出到之前指定的介质中(这里是客户端浏览器)
    61. wk.write();
    62. //操作完成时,关闭对象,释放占用的内存空间
    63. wk.close();
    64.   加下划线这部分代码是B/S模式中采用的输出方式,而不是输出到本地指定的磁盘目录。该代码表示将temp.xls的Excel文件通过应答实体(response)输出给请求的客户端浏览器,下载到客户端本地(保存或直接打开)。若要直接输出到磁盘文件可采用下列代码替换加下划线这部分代码
    65. File file= new File( "D://temp.xls");
    66. WritableWorkbook wwb = Workbook.createWorkbook(file);


    3.3高级操作

    3.3.1数据格式化

    在Excel中不涉及复杂的数据类型,能够比较好的处理字串、数字和日期已经能够满足一般的应用即可。

    数据的格式化涉及到的是字体、粗细、字号等元素,这些功能主要由 WritableFont和WritableCellFormat类来负责。例如:

    ① WritableFont font=new WritableFont(WritableFont.createFont("宋体"),12,WritableFont.NO_BOLD );

    ② WritableCellFormat format1=new WritableCellFormat(font);

    ③ Label label=new Label(0,0,”data 4 test”,format1);

    其中

    I.指定了字串格式:字体为宋体,字号16,加粗显示。WritableFont有非常丰富的构造子,供不同情况下使用,jExcelAPI的java-doc中有详细列表,这里不再列出。

    II. 处代码使用了WritableCellFormat类,这个类非常重要,通过它可以指定单元格的各种属性,如上例代码所示。

    III. 处使用了Label类的构造子,指定了显示的位置,文本内容,字串被赋予的格式。

    与Label类似的Number、DateTime,区别Label表示文本数据;Number表示数值数据,可使NumberFormat格式化数据;用DateTime表示日期型数据,可应用DateFormat格式化数据。

    3.3.2单元格操作

    Excel中很重要的一部分是对单元格的操作,比如行高、列宽、单元格合并等,所幸jExcelAPI提供了这些支持。这些操作相对比较简单,下面只介绍一下相关的API。

    1、 合并单元格

     
    1. WritableSheet.mergeCells( int m, int n, int p, int q);
    2. //作用是从(m,n)到(p,q)的单元格全部合并,比如:
    3. WritableSheet sheet=book.createSheet(“第一页”, 0);
    4. //合并第一列第一行到第六列第一行的所有单元格
    5. sheet.mergeCells( 0, 0, 5, 0);
    6. //合并既可以是横向的,也可以是纵向的。合并后的单元格不能再次进行合并,否则会触发异常。

    2、 行高和列宽

     
    1. writableSheet.setRowView( int i, int height);
    2. //作用是指定第i+1行的高度,比如:
    3. // 将第一行的高度设为200
    4. sheet.setRowView( 0, 200);
    5. WritableSheet.setColumnView( int i, int width);
    6. //作用是指定第i+1列的宽度,比如:
    7. //将第一列的宽度设为30
    8. sheet.setColumnView( 0, 30);

    3.4  从Excel文件读取数据表

    我们就以导入3.2所产生的excel表为例,掌握如何编写导入Excel代码(该代码封装在业务层方法)

     
    1. public List<ScoreInfo> loadScoreInfo(String xlsPath) throws IOException, BiffException{
    2. //导入已存在的Excel文件,获得只读的工作薄对象
    3. FileInputStream fis= new FileInputStream(xlsPath);
    4. Workbook wk=Workbook.getWorkbook(fis);
    5. //获取第一张Sheet表
    6. Sheet sheet=wk.getSheet( 0);
    7. //获取总行数
    8. int rowNum=sheet.getRows();
    9. //从数据行开始迭代每一行
    10. for( int i= 2;i<rowNum;i++){
    11. ScoreInfo info= new ScoreInfo();
    12. //getCell(column,row),表示取得指定列指定行的单元格(Cell)
    13. //getContents()获取单元格的内容,返回字符串数据。适用于字符型数据的单元格
    14. //使用实体类封装单元格数据
    15. info.setStuName(sheet.getCell( 0, i).getContents());
    16. info.setClassName(sheet.getCell( 1, i).getContents());
    17. //判断单元格的类型,单元格主要类型LABEL、NUMBER、DATE if(sheet.getCell(2,i).getType==CellType.NUMBER){
    18. //转化为数值型单元格
    19. NumberCell numCell=(NumberCell)sheet.getCell( 2,i);
    20. //NumberCell的getValue()方法取得单元格的数值型数据
    21. info.setRscore(numCell.getValue());
    22. }
    23. if(sheet.getCell( 3,i).getType==CellType.NUMBER){
    24. NumberCell numCell=(NumberCell)sheet.getCell( 3,i);
    25. info.setRscore(numCell.getValue);
    26. }
    27. if(sheet.getCell( 4,i).getType==CellType.DATE){
    28. DateCell dateCell=(DateCell)sheet.getCell( 4,i);
    29. //DateCell的getDate()方法取得单元格的日期型数据
    30. info.setDate(dateCell.getDate());
    31. }
    32. }
    33. fis.close();
    34. wk.close();
    35. }

    3.4  更新已存在的Excel文件

    将3.2所产生的excel表(temp.xls)的第一条记录(excel文件的指第三行)的班级名称改为As179,代码如下:

     
    1. File file= new File( "d://temp.xls");
    2. //导入已存在的Excel文件,获得只读的工作薄对象
    3. Workbook wk=Workbook.getWorkbook(file);
    4. //根据只读的工作薄对象(wk)创建可写入的Excel工作薄对象
    5. WritableWorkbook wwb=Workbook.createWorkbook(file, wk);
    6. //读取第一张工作表
    7. WritableSheet sheet=wwb.getSheet( 0);
    8. ///获得要编辑的单元格对象
    9. WritableCell cell=sheet.getWritableCell( 1, 2);
    10. //判断单元格的类型, 做出相应的转化
    11. if(cell.getType()==CellType.LABEL){
    12. Label lable=(Label)cell;
    13. //修改单元格的内容
    14. lable.setString( "As179");
    15. }
    16. wwb.write();
    17. wwb.close();
    18. wk.close();

    对于更新已存在的Excel文件实际上就是获取已有工作薄对象(但是只读的),然后将获取的只读的工作薄对象转化为可写入的Excel工作薄对象(WritableWorkbook ),其他部分就是通过可写入WritableSheet 对象和可写入WritableCell 对象进行编辑。

    展开全文
  • 问题:目前,无论是JXL还是POI,对Excel的操作都是比较原始的,用户无法使用这些框架代码直接读取Excle并相应相应的数据实体(Entity),也无法直接将数据实体写入到Excle文件中去。 本文章要介绍的是一个对JXL框架...
  • java生成 excel 并导出文件

    万次阅读 多人点赞 2016-11-18 10:10:10
    目前,比较常用的实现Java导入、导出Excel的技术有两种Jakarta POI和JavaExcel当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统、银行系统)...

     

    给大家介绍一个代码在线自动生成的网站:www.5ceo.cn 技术之家    或者加qq群: 527796869


    目前,比较常用的实现Java导入、导出Excel的技术有两种Jakarta POI和Java Excel当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统、银行系统)。或者是:我们已经习惯用Excel打印。这样在我们实际的开发中,很多时候需要实现导入、导出Excel的应用。

    下面我就分别讲解一下如何使用这两个技术实现导入、导出Excel


    2.1 环境配置Jakarta POI 是一套用于访问微软格式文档的Java API。Jakarta POI有很多组件组成,其中有用于操作Excel格式文件的HSSF和用于操作Word的HWPF,在各种组件中目前只有用于操作Excel的HSSF相对成熟。官方主页http://poi.apache.org/index.html,API文档http://poi.apache.org/apidocs/index.html

    2.1.1下载jar

    官方下载:http://poi.apache.org/download.html这里可以下载到它的最新版本和文档,目前最新版本是3.7,这里使用比较稳定的3.6版。

    2.1.2加入jar包

    将根目录下的poi-3.6-20091214.jar和Lib目录下三个通用包 commons-logging-1.1.jar junit-3.8.1.jar log4j-1.2.13.jar拷贝到项目的Lib下

    2.2 Jakarta POI HSSF API组件

    HSSF(用于操作Excel的组件)提供给用户使用的对象在rg.apache.poi.hssf.usermodel包中,主要部分包括Excel对象,样式和格式,还有辅助操作。有以下几种对象: 

    常用组件:

    HSSFWorkbook                      excel的文档对象

    HSSFSheet                         excel的表单

    HSSFRow                           excel的行

    HSSFCell                          excel的格子单元

    HSSFFont                          excel字体

    HSSFDataFormat                    日期格式

    HSSFHeader                        sheet头

    HSSFFooter                        sheet尾(只有打印的时候才能看到效果)

    样式:

    HSSFCellStyle                       cell样式

    辅助操作包括:

    HSSFDateUtil                        日期

    HSSFPrintSetup                      打印

    HSSFErrorConstants                  错误信息表

    2.3 基本操作步骤

    首先,理解一下一个Excel的文件的组织形式,一个Excel文件对应于一个workbook(HSSFWorkbook),一个workbook可以有多个sheet(HSSFSheet)组成,一个sheet是由多个row(HSSFRow)组成,一个row是由多个cell(HSSFCell)组成。

    基本操作步骤:

    1、用HSSFWorkbook打开或者创建“Excel文件对象”

    2、用HSSFWorkbook对象返回或者创建Sheet对象

    3、用Sheet对象返回行对象,用行对象得到Cell对象

    4、对Cell对象读写。

    下面来看一个动态生成Excel文件的例子:

    //创建HSSFWorkbook对象
    HSSFWorkbook wb = new HSSFWorkbook();
    //创建HSSFSheet对象
    HSSFSheet sheet = wb.createSheet("sheet0");
    //创建HSSFRow对象
    HSSFRow row = sheet.createRow(0);
    //创建HSSFCell对象
    HSSFCell cell=row.createCell(0);
    //设置单元格的值
    cell.setCellValue("单元格中的中文");
    //输出Excel文件
    FileOutputStream output=new FileOutputStream("d:\\workbook.xls");
    wkb.write(output);
    output.flush();

    HSSF读取文件同样还是使用这几个对象,只是把相应的createXXX方法变成了getXXX方法即可。可见只要理解了其中原理,不管是读还是写亦或是特定格式都可以轻松实现,正所谓知其然更要知其所以然。

    2.4 导出Excel应用实例

     在2.3中我们寥寥几行代码实际上就已经就是实现了导出Excel一个简单示例,下面我们在看如何实现导出如图所示的Excel表格?

    代码如下:(实际开发中应封装到业务层组件中,然后在控制层中调用。这里直接写在控制层组件,如Servlet的doGet/doPost方法或Struts框架的execute方法中)

     
    //创建HSSFWorkbook对象(excel的文档对象)
          HSSFWorkbook wb = new HSSFWorkbook();
    //建立新的sheet对象(excel的表单)
    HSSFSheet sheet=wkb.createSheet("成绩表");
    //在sheet里创建第一行,参数为行索引(excel的行),可以是0~65535之间的任何一个
    HSSFRow row1=sheet.createRow(0);
    //创建单元格(excel的单元格,参数为列索引,可以是0~255之间的任何一个
    HSSFCell cell=row1.createCell(0);
          //设置单元格内容
    cell.setCellValue("学员考试成绩一览表");
    //合并单元格CellRangeAddress构造参数依次表示起始行,截至行,起始列, 截至列
    sheet.addMergedRegion(new CellRangeAddress(0,0,0,3));
    //在sheet里创建第二行
    HSSFRow row2=sheet.createRow(1);    
          //创建单元格并设置单元格内容
          row2.createCell(0).setCellValue("姓名");
          row2.createCell(1).setCellValue("班级");    
          row2.createCell(2).setCellValue("笔试成绩");
    row2.createCell(3).setCellValue("机试成绩");    
          //在sheet里创建第三行
          HSSFRow row3=sheet.createRow(2);
          row3.createCell(0).setCellValue("李明");
          row3.createCell(1).setCellValue("As178");
          row3.createCell(2).setCellValue(87);    
          row3.createCell(3).setCellValue(78);    
      //.....省略部分代码
    
    
    //输出Excel文件
        OutputStream output=response.getOutputStream();
        response.reset();
        response.setHeader("Content-disposition", "attachment; filename=details.xls");
        response.setContentType("application/msexcel");        
        wkb.write(output);
        output.close();
    retrun null;

    加下划线这部分代码是B/S模式中采用的输出方式,而不是输出到本地指定的磁盘目录。该代码表示将details.xls的Excel文件通过应答实体(response)输出给请求的客户端浏览器,客户端可保存或直接打开。

    2.5 样式设置

    在实际应用中导出的Excel文件往往需要阅读和打印的,这就需要对输出的Excel文档进行排版和样式的设置,主要操作有合并单元格、设置单元格样式、设置字体样式等。

    2.5.1单元格合并

        使用HSSFSheet的addMergedRegion()方法

     
    public int addMergedRegion(CellRangeAddress region)

        参数CellRangeAddress 表示合并的区域,构造方法如下:

     
    CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol)

    构造参数依次表示起始行,截至行,起始列, 截至列。示例代码参照2.4部分

    2.5.2设置单元格的行高、列宽

     
    HSSFSheet sheet=wb.createSheet();
    
    sheet.setDefaultRowHeightInPoints(10);//设置缺省列高sheet.setDefaultColumnWidth(20);//设置缺省列宽
    
    //设置指定列的列宽,256 * 50这种写法是因为width参数单位是单个字符的256分之一
    
    sheet.setColumnWidth(cell.getColumnIndex(), 256 * 50);

    2.5.2单元格样式

    1、创建HSSFCellStyle

     
     HSSFCellStyle cellStyle=wkb.createCellStyle()

    2、设置样式

     
     // 设置单元格的横向和纵向对齐方式,具体参数就不列了,参考HSSFCellStyle
    
      cellStyle.setAlignment(HSSFCellStyle.ALIGN_JUSTIFY);
    
      cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
    
      /* 设置单元格的填充方式,以及前景颜色和背景颜色
    
       三点注意:
    
       1.如果需要前景颜色或背景颜色,一定要指定填充方式,两者顺序无所谓;
    
       2.如果同时存在前景颜色和背景颜色,前景颜色的设置要写在前面;
    
       3.前景颜色不是字体颜色。
    
      */
    
      //设置填充方式(填充图案)
    
      cellStyle.setFillPattern(HSSFCellStyle.DIAMONDS);
    
      //设置前景色
    
      cellStyle.setFillForegroundColor(HSSFColor.RED.index);
    
      //设置背景颜色
    
      cellStyle.setFillBackgroundColor(HSSFColor.LIGHT_YELLOW.index);
    
      // 设置单元格底部的边框及其样式和颜色
    
      // 这里仅设置了底边边框,左边框、右边框和顶边框同理可设
    
      cellStyle.setBorderBottom(HSSFCellStyle.BORDER_SLANTED_DASH_DOT);
    
      cellStyle.setBottomBorderColor(HSSFColor.DARK_RED.index);
    
      //设置日期型数据的显示样式
    
      cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));  

    3、将样式应用于单元格

     
      cell.setCellStyle(cellStyle);
    
      //将样式应用到行,但有些样式只对单元格起作用
    
      row.setRowStyle(cellStyle);

    2.5.2设置字体样式

    1、创建HSSFFont对象(调用HSSFWorkbook 的createFont方法)

     
    HSSFWorkbook wb=new HSSFWorkbook();
    
    HSSFFont  fontStyle=wb.createFont();
    
    HSSFWorkbook wb=new HSSFWorkbook ();

    2、设置字体各种样式

     
      //设置字体样式
    
      fontStyle.setFontName("宋体");  
    
      //设置字体高度
    
      fontStyle.setFontHeightInPoints((short)20);  
    
      //设置字体颜色
    
      font.setColor(HSSFColor.BLUE.index);
    
      //设置粗体
    
      fontStyle.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
    
      //设置斜体
    
    font.setItalic(true);
    
    //设置下划线
    
    font.setUnderline(HSSFFont.U_SINGLE);

    3、将字体设置到单元格样式

     

    //字体也是单元格格式的一部分,所以从属于HSSFCellStyle
    
    // 将字体对象赋值给单元格样式对象
    
    cellStyle.setFont(font);
    
    // 将单元格样式应用于单元格
    
    cell.setCellStyle(cellStyle);

     

     

    2.6 导入Excel应用实例

    实现将已存在的Excel文件中的数据导入到系统中的基本步骤同导出十分的类似,关键在于要了解要导入Excel文件的结构,比如数据有哪些列、读取数据起始位置(有效数据从第几行几列开始)等。在实际项目中由于这些数据(Excel文件)往往来自于日常办公人员或其他系统平台产生的业务数据,因此这些Excel文件的数据格式要有统一的要求,并提供访问接口(指访问途径),这样在所需数据的系统中就可通过提供这个访问接口调用方法,从而获得数据。解决方案采用Web Service是不错的选择。这里,我们就以导入2..4所产生的excel表为例,重点掌握如何编写导入Excel代码

     
    public List<ScoreInfo> loadScoreInfo(String xlsPath) throws IOException{
        List temp = new ArrayList();
    FileInputStream fileIn = new FileInputStream(xlsPath);
    //根据指定的文件输入流导入Excel从而产生Workbook对象
    Workbook wb0 = new HSSFWorkbook(fileIn);
    //获取Excel文档中的第一个表单
    Sheet sht0 = wb0.getSheetAt(0);
    //对Sheet中的每一行进行迭代
            for (Row r : sht0) {
            //如果当前行的行号(从0开始)未达到2(第三行)则从新循环
    If(r.getRowNum()<1){
    continue;
    }
    //创建实体类
    ScoreInfo info=new ScoreInfo();
    //取出当前行第1个单元格数据,并封装在info实体stuName属性上
    info.setStuName(r.getCell(0).getStringCellValue());
    info.setClassName(r.getCell(1).getStringCellValue());
    info.setRscore(r.getCell(2).getNumericCellValue());
                info.setLscore(r.getCell(3).getNumericCellValue());
    temp.add(info);
            }
            fileIn.close();    
            return temp;    
        }


    ● 支持Excel 95-2000的所有版本   Java Excel是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容、创建新的Excel文件、更新已经存在的Excel文件。jxl 由于其小巧 易用的特点, 逐渐已经取代了 POI-excel的地位, 成为了越来越多的java开发人员生成excel文件的首选。Java  Excel的特征:

             ● 生成Excel 2000标准格式 
             ● 支持字体、数字、日期格式化操作 
             ● 支持对单元格加阴影和加色彩;

    ● 修改存在的工作表;
             ● 支持图像和图表

    ● 日志记录可以定制

    ● 更小更快更省内存

    应该说以上功能已经能够大致满足我们的需要。最关键的是这套API是纯Java的,并不依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件。另外需要说明的是,这套API对图形和图表的支持很有限,而且仅仅识别PNG格式。在线帮助文档http://jexcelapi.sourceforge.net/resources/javadocs/2_6_10/docs/index.html

    在这里我们将通过一些实例,学习掌握读取、新建、更新,其中也包括常见格式的设置:字体、颜色、背景、合并单元格等操作,有这些其实已经基本足够应付大部分问题了。

    3.1环境配置

    3.1.1下载

    下载地址    http://www.andykhan.com/jexcelapi/

    3.1.2 加入jar包

    将jxl.jar拷贝到项目的Lib下

    3.2 使用Java Excel Api 导出 Excel文件

    下面我们在看如何使用Java Excel实现导出Excel表格?

    代码如下:(实际开发中应封装到业务层组件中,然后在控制层中调用。这里直接写在控制层组件,如Servlet的doGet/doPost方法或Struts框架的execute方法中)

     

    //获得输出流,该输出流的输出介质是客户端浏览器
    
      OutputStream output=response.getOutputStream();
    
      response.reset();
    
      response.setHeader("Content-disposition","attachment;           filename=temp.xls");
    
      response.setContentType("application/msexcel");
    
      //创建可写入的Excel工作薄,且内容将写入到输出流,并通过输出流输出给客户端浏览
    
      WritableWorkbook wk=Workbook.createWorkbook(output);
    
    
    ///创建可写入的Excel工作表
    
        WritableSheet sheet=wk.createSheet("成绩表", 0);
    
    //把单元格(column, row)到单元格(column1, row1)进行合并。
    
    //mergeCells(column, row, column1, row1);
    
      sheet.mergeCells(0,0, 4,0);//单元格合并方法
    
    //创建WritableFont 字体对象,参数依次表示黑体、字号12、粗体、非斜体、不带下划线、亮蓝色
    
    WritableFont titleFont=new WritableFont(WritableFont.createFont("黑体"),12,WritableFont.BOLD,false,UnderlineStyle.NO_UNDERLINE,Colour.LIGHT_BLUE);
    
    //创建WritableCellFormat对象,将该对象应用于单元格从而设置单元格的样式
    
    WritableCellFormat titleFormat=new WritableCellFormat();
    
    //设置字体格式
    
    titleFormat.setFont(titleFont);
    
    //设置文本水平居中对齐
    
    titleFormat.setAlignment(Alignment.CENTRE);
    
    //设置文本垂直居中对齐
    
    titleFormat.setVerticalAlignment(VerticalAlignment.CENTRE);
    
    //设置背景颜色
    
    titleFormat.setBackground(Colour.GRAY_25);
    
    //设置自动换行
    
    titleFormat.setWrap(true);
    
    //添加Label对象,参数依次表示在第一列,第一行,内容,使用的格式
    
    Label lab_00=new Label(0,0,"学员考试成绩一览表",titleFormat);
    
    //将定义好的Label对象添加到工作表上,这样工作表的第一列第一行的内容为‘学员考试成绩一览表’并应用了titleFormat定义的样式
    
    sheet.addCell(lab_00);
    
    WritableCellFormat cloumnTitleFormat=new WritableCellFormat();
    
    cloumnTitleFormat.setFont(new WritableFont(WritableFont.createFont("宋体"),10,WritableFont.BOLD,false));
    
    cloumnTitleFormat.setAlignment(Alignment.CENTRE);
    
    Label lab_01=new Label(0,1,"姓名",cloumnTitleFormat);
    
    Label lab_11=new Label(1,1,"班级",cloumnTitleFormat);
    
    Label lab_21=new Label(2,1,"笔试成绩",cloumnTitleFormat);
    
    Label lab_31=new Label(3,1,"上机成绩",cloumnTitleFormat);
    
    Label lab_41=new Label(4,1,"考试日期",cloumnTitleFormat);
    
      sheet.addCell(lab_01);
    
      sheet.addCell(lab_11);
    
      sheet.addCell(lab_21);
    
      sheet.addCell(lab_31);
    
      sheet.addCell(lab_41);
    
      sheet.addCell(new Label(0,2,"李明"));
    
      sheet.addCell(new Label(1,2,"As178"));
    
    //定义数字格式
    
    NumberFormat nf=new NumberFormat("0.00");
    
    WritableCellFormat wcf=new WritableCellFormat(nf);
    
    //类似于Label对象,区别Label表示文本数据,Number表示数值型数据
    
    Number numlab_22=new Number(2,2,78,wcf);
    
    sheet.addCell(numlab_22);
    
    sheet.addCell(newNumber(3,2,87,new WritableCellFormat(new NumberFormat("#.##") )));
    
    //定义日期格式
    
    DateFormat df=new DateFormat("yyyy-MM-dd hh:mm:ss");
    
    //创建WritableCellFormat对象
    
    WritableCellFormat datewcf=new WritableCellFormat(df);
    
    //类似于Label对象,区别Label表示文本数据,DateTime表示日期型数据
    
    DateTime dtLab_42=new DateTime(4,2,new Date(),datewcf);
    
    sheet.addCell(dtLab_42);   
    
    //将定义的工作表输出到之前指定的介质中(这里是客户端浏览器)
    
    wk.write();
    
    //操作完成时,关闭对象,释放占用的内存空间   
    
    wk.close();
      加下划线这部分代码是B/S模式中采用的输出方式,而不是输出到本地指定的磁盘目录。该代码表示将temp.xls的Excel文件通过应答实体(response)输出给请求的客户端浏览器,下载到客户端本地(保存或直接打开)。若要直接输出到磁盘文件可采用下列代码替换加下划线这部分代码
    File file=new File("D://temp.xls");
    WritableWorkbook wwb = Workbook.createWorkbook(file); 

     

    3.3高级操作

    3.3.1数据格式化

    在Excel中不涉及复杂的数据类型,能够比较好的处理字串、数字和日期已经能够满足一般的应用即可。

    数据的格式化涉及到的是字体、粗细、字号等元素,这些功能主要由 WritableFont和WritableCellFormat类来负责。例如:

    ① WritableFont font=new WritableFont(WritableFont.createFont("宋体"),12,WritableFont.NO_BOLD );

    ② WritableCellFormat format1=new WritableCellFormat(font);

    ③ Label label=new Label(0,0,”data 4 test”,format1);

    其中

    I.指定了字串格式:字体为宋体,字号16,加粗显示。WritableFont有非常丰富的构造子,供不同情况下使用,jExcelAPI的java-doc中有详细列表,这里不再列出。

    II. 处代码使用了WritableCellFormat类,这个类非常重要,通过它可以指定单元格的各种属性,如上例代码所示。

    III. 处使用了Label类的构造子,指定了显示的位置,文本内容,字串被赋予的格式。

    与Label类似的Number、DateTime,区别Label表示文本数据;Number表示数值数据,可使NumberFormat格式化数据;用DateTime表示日期型数据,可应用DateFormat格式化数据。

    3.3.2单元格操作

    Excel中很重要的一部分是对单元格的操作,比如行高、列宽、单元格合并等,所幸jExcelAPI提供了这些支持。这些操作相对比较简单,下面只介绍一下相关的API。

    1、 合并单元格

     
    WritableSheet.mergeCells(int m,int n,int p,int q);
    
    //作用是从(m,n)到(p,q)的单元格全部合并,比如:
    
    WritableSheet sheet=book.createSheet(“第一页”,0);
    
    //合并第一列第一行到第六列第一行的所有单元格
    
    sheet.mergeCells(0,0,5,0);
    
    //合并既可以是横向的,也可以是纵向的。合并后的单元格不能再次进行合并,否则会触发异常。

    2、 行高和列宽

     
     writableSheet.setRowView(int i,int height);
    
    //作用是指定第i+1行的高度,比如:
    
    // 将第一行的高度设为200
    
    sheet.setRowView(0,200);
    
    WritableSheet.setColumnView(int i,int width);
    
    //作用是指定第i+1列的宽度,比如:
    
    //将第一列的宽度设为30
    
    sheet.setColumnView(0,30); 

    3.4  从Excel文件读取数据表

    我们就以导入3.2所产生的excel表为例,掌握如何编写导入Excel代码(该代码封装在业务层方法)

     
    public List<ScoreInfo> loadScoreInfo(String xlsPath) throws IOException, BiffException{
    
    //导入已存在的Excel文件,获得只读的工作薄对象
            FileInputStream fis=new FileInputStream(xlsPath);
            Workbook wk=Workbook.getWorkbook(fis);
            //获取第一张Sheet表 
            Sheet sheet=wk.getSheet(0);
            //获取总行数
    int rowNum=sheet.getRows();
    //从数据行开始迭代每一行
            for(int i=2;i<rowNum;i++){
    ScoreInfo info=new ScoreInfo();        
    //getCell(column,row),表示取得指定列指定行的单元格(Cell)
    //getContents()获取单元格的内容,返回字符串数据。适用于字符型数据的单元格
    //使用实体类封装单元格数据
    info.setStuName(sheet.getCell(0, i).getContents());
                info.setClassName(sheet.getCell(1, i).getContents());
                //判断单元格的类型,单元格主要类型LABEL、NUMBER、DATE                    if(sheet.getCell(2,i).getType==CellType.NUMBER){
    
    //转化为数值型单元格
    NumberCell numCell=(NumberCell)sheet.getCell(2,i);
    //NumberCell的getValue()方法取得单元格的数值型数据
    info.setRscore(numCell.getValue());
    
    }
    if(sheet.getCell(3,i).getType==CellType.NUMBER){
    NumberCell numCell=(NumberCell)sheet.getCell(3,i);
    info.setRscore(numCell.getValue);
    }
    
    if(sheet.getCell(4,i).getType==CellType.DATE){
    DateCell dateCell=(DateCell)sheet.getCell(4,i);
    //DateCell的getDate()方法取得单元格的日期型数据
    info.setDate(dateCell.getDate());
    }
            }
            fis.close();
            wk.close();
    }

    3.4  更新已存在的Excel文件

    将3.2所产生的excel表(temp.xls)的第一条记录(excel文件的指第三行)的班级名称改为As179,代码如下:

     
    File file=new File("d://temp.xls");
    //导入已存在的Excel文件,获得只读的工作薄对象
    Workbook wk=Workbook.getWorkbook(file);
    //根据只读的工作薄对象(wk)创建可写入的Excel工作薄对象 
            WritableWorkbook wwb=Workbook.createWorkbook(file, wk);
    //读取第一张工作表 
            WritableSheet sheet=wwb.getSheet(0);
    ///获得要编辑的单元格对象 
            WritableCell cell=sheet.getWritableCell(1, 2);
            //判断单元格的类型, 做出相应的转化 
    if(cell.getType()==CellType.LABEL){
                Label lable=(Label)cell;
                //修改单元格的内容
    lable.setString("As179");
            }
        wwb.write(); 
        wwb.close(); 
        wk.close(); 

     

    对于更新已存在的Excel文件实际上就是获取已有工作薄对象(但是只读的),然后将获取的只读的工作薄对象转化为可写入的Excel工作薄对象(WritableWorkbook ),其他部分就是通过可写入WritableSheet 对象和可写入WritableCell 对象进行编辑。

    公众号


    来自:http://blog.csdn.net/jerehedu/article/details/45195359

     

    展开全文
  • 下载安装包后,直接解压发布项目,运行index.jsp即可, 代码有详细的注解,希望你们可以看的懂
  • 做OA管理系统的时候,刚好有个需求:根据指定条件从MYSQL数据库获取列表,将列表生成Excel,并直接下载到本地 工具及插件 项目框架:SpringBoot + Mybatis + MySQL 第三方插件:Lombok 项目引用的是Apache poi...

    前言

    做OA管理系统的时候,刚好有个需求:根据指定条件从MYSQL数据库获取列表,将列表生成Excel,并直接下载到本地

    工具及插件

    项目框架:SpringBoot + Mybatis + MySQL

    第三方插件:Lombok

    项目引用的是Apache poi生成EXCEL文件

    最终导出结果会是这样的,如图:

    一、前端调用

    $("#button").click(function(){
        let params = let params =  "?city = '北京'&street = '西长安街'";
        window.location.href = "http://127.0.0.1:8080/excel/exportExcel" + params;
    });
    

    二、后端接口

    代码中引用了lombok插件,直接使用注解的方式

    Result类 是我自己封装的一个返回结果类

    Maven

    <!-- poi -->
    <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-scratchpad</artifactId>
    	<version>3.17</version>
    </dependency>

    控制层Controller

    import javax.servlet.http.HttpServletResponse;
    import java.util.Map;
    
    @RestController
    @RequestMapping("excel")
    public class ExcelController {
    
    	@Autowired
        private ExcelService excelService;
    
    	/**
    	 * 批量导出
    	 */
    	@RequestMapping("/exportExcel")
    	public Result<?> exportExcel(@RequestParam Map<String, Object> params, HttpServletResponse response) {
    		try{
    			excelService.exportExcel(params, response);
    			return Result.succeed("导出成功");
    		}catch (Exception e) {
    			e.printStackTrace();
    			return Result.failed("导出异常");
    		}
    	}
    
    }

    业务逻辑层

    /**
     * 业务逻辑 接口
     */
    public interface ExcelService {
    
    	public void exportExcel(Map<String, Object> params, HttpServletResponse response);
    	
    }

    数据库数据处理的时候,逻辑上可能会比较繁琐,最终都是以字符串的形式存入Excel

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import javax.servlet.http.HttpServletResponse;
    import java.text.SimpleDateFormat;
    import java.util.*;
    
    /**
     * 业务逻辑 实现类
     */
    @Service
    public class excelServiceImpl implements HrInterviewService {
    	
    	// 数据库调用接口
    	@Autowired
        private PersonDao personDao;
    
    	@Override
        public void exportExcel(Map<String, Object> params,HttpServletResponse response) {
            // 列名,表格第一行
            List<String> rowNameList = Arrays.asList("日期", "城市", "街道", "姓名", "性别", "年龄", "联系方式");
    
            // 获取数据库数据,查询XXX城市的XXX街道人口信息列表
            List<Person> dataList = personDao.getPersonList(params);
    
            /** 数据库数据整合 */
            // 列名 数据
            List<Map<String, String>> list = new ArrayList<>();
    		// SimpleDateFormat时间格式
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
    		// 循环填表
            for (Person item : dataList) {
                Map<String, String> map = new HashMap<>();
    			// 日期
                if (item.getNowDate() != null){
                    map.put("日期", sdf.format(item.getNowDate()));
                }else {
                    map.put("日期", "");
                }
    			// 城市
    			map.put("城市", item.getCity() + "");
    			// 街道
    			map.put("街道", item.getStreet() + "");
    			// 姓名
                map.put("姓名", item.getUserName() + "");
    			// 性别,数据库用01区分男女
                if (item.getSex() != null && !"".equals(item.getSex())){
                    if (item.getSex() == 0){
                        map.put("性别", "女");
                    }else {
                        map.put("性别", "男");
                    }
                }else {
                    map.put("性别", "");
                }
    			// 年龄
                if (item.getAge() != null){
                    map.put("年龄", item.getAge()+"");
                }else {
                    map.put("年龄", "");
                }
    			// 联系方式
                map.put("联系方式", item.getTelephone());
                list.add(map);
            }
            // 将需要写入Excel的数据传入
            ExcelUtils.excelPort("人口信息记录表", rowNameList, list, response);
        }
    
    }

    数据持久层

    @Repository
    @Mapper
    public interface PersonDao {
    
    	@Select("SELECT * FROM person WHERE city = #{params.city} AND street = #{params.street}")
        List<Person> getPersonList(@Param("params") Map<String, Object> params);
    
    }

    实体类层

    import com.fasterxml.jackson.annotation.JsonFormat;
    import org.springframework.format.annotation.DateTimeFormat;
    import lombok.Data;
    import java.io.Serializable;
    import java.util.Date;
    
    @Data
    public class Person implements Serializable{
        private static final long serialVersionUID = 1L;
        // id
        private Integer id;
    	// 日期
        @DateTimeFormat(pattern = "yyyy-MM-dd")
        @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
        private Date nowDate;
    	// 城市
        private String city;
    	// 街道
        private String street;
    	// 姓名
        private String userName;
    	// 性别
        private Integer sex;
    	// 年龄
        private Integer age;
    	// 联系方式
        private String telephone;
    }
    

    工具类

    import org.apache.poi.ss.usermodel.*;
    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 javax.servlet.http.HttpServletResponse;
    import java.io.OutputStream;
    import java.text.DecimalFormat;
    import java.text.SimpleDateFormat;
    import java.util.*;
    import java.util.prefs.BackingStoreException;
    
    /**
     * Excel工具类
     */
    public class ExcelUtils {
    
        /**
         * @param sheetName     工作表名,文件名,头部信息
         * @param rowNameList   列名
         * @param list          需要写入的数据
         * @param response      返回
         */
        public static void excelPort(String sheetName, List<String> rowNameList, List<Map<String, String>> list, HttpServletResponse response) {
            try {
                if (list.size() == 0) {
                    throw new BackingStoreException("数据为空");
                }
                // 声明一个工作簿
                XSSFWorkbook wb = new XSSFWorkbook();
                // 创建sheet页
                XSSFSheet sheet = wb.createSheet(sheetName);
                sheet.setDefaultColumnWidth(19);
    
                // 全局加线样式
                CellStyle cellStyle = wb.createCellStyle();
                cellStyle.setBorderBottom(BorderStyle.THIN);//下边框
                cellStyle.setBorderLeft(BorderStyle.THIN);//左边框
                cellStyle.setBorderTop(BorderStyle.THIN);//上边框
                cellStyle.setBorderRight(BorderStyle.THIN);//右边框
                cellStyle.setAlignment(HorizontalAlignment.CENTER);//居中
                cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//上下居中
    
                // 记录标题信息
                TreeMap<String, Integer> headMap = new TreeMap<>();
    
                // 标题写入
                XSSFRow row = sheet.createRow(0);
                for (int i = 0; i < rowNameList.size(); i++) {
                    row.setHeight((short) 450);
                    XSSFCell cell = row.createCell(i);
                    String headName = rowNameList.get(i);
                    cell.setCellValue(headName); //写入列名
                    headMap.put(headName, i);
                    cell.setCellStyle(cellStyle);
                }
    
                // 写入内容数据
                int ind = 1;
                for (Map<String, String> map : list) {
                    XSSFRow r = sheet.createRow(ind++);
                    for (Map.Entry<String, Integer> m : headMap.entrySet()) {
                        String name = m.getKey(); // 列名
                        String value = map.get(name); // value 不一定存在
                        XSSFCell cell2 = r.createCell(m.getValue());
                        if (value != null) {
                            cell2.setCellValue(value);
                        }
                        cell2.setCellStyle(cellStyle);
                    }
                }
    
                // 输出Excel文件
                OutputStream output = response.getOutputStream();
                response.reset();
                // 设置文件头
                response.setHeader("Content-Disposition",
                        "attchement;filename=" + new String((sheetName + ".xls").getBytes("gb2312"), "ISO8859-1"));
                response.setContentType("application/msexcel");
                wb.write(output);
                wb.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    
    }
    

     

     

    展开全文
  • 文章目录前言(这里只给演示控制层和biz层因为主要逻辑都在biz层,service就不演示了 都是查询数据库的逻辑)一、生成Excel文件进行转PDF导出二、使用步骤-------标题(注意不要直接复制,因为里面还有好多查询数据库的...

    提示:本人写博客只是自己记录一下自己学到的到时候我可以自己找到本人的博客,进行选择性复制


    前言(这里只给演示控制层和biz层因为主要逻辑都在biz层,service就不演示了 都是查询数据库的逻辑)

    这是我第二次写博客了记录一下,以后用的到首先今天写的是java如何生成Excel文件,生成Excel后再进行转PDF文件进行导出


    提示:以下是本篇文章正文内容,下面案例可供参考

    一、生成Excel文件进行转PDF导出

    开始直接上代码
    注意:本人是在工作中开发记录的,所以我们公司整体模块划分顺序为:
    controller层>biz层>service层>serviceImpl层>manger层>dao层>mapper层>mapper.xml层(写sql语句的)

    二、使用步骤

    -------标题(注意不要直接复制,因为里面还有好多查询数据库的方法,逻辑不通的,根据自己的需求去查询然后去做Excel表格的格式!!!)

    1.控制层controller

    代码如下:
    注意:我这里token需要验证,我的接口面向客户端的,而不是面向网页版的

    /**
         * 导出评标表格PDF文件,专家进行线上签字
         *
         * @param resp 响应头
         * @param csId 采购项目子包ID
         * @param token 验证客户端的token
         * @author Sxing
         * @since 2020年11月5日09:14:28
         */
        @SysLog("导出评标表格PDF文件,评标专家进行线上签名")
        @RequestMapping("/exportEvalForm")
        public void exportEvalForm(HttpServletResponse resp, Long csId, String token) {
            cpWsEvalBidToolBiz.exportEvalForm(resp, csId, token);
        }
    

    2.biz:

    对了 强调一下我们公司在service层就已经做好了封装如返回的是:

    ResultDTO<List<CpSecEvalResultSummaryBO>>
    

    所以调用service层还需要后面加上 **.getDate()**方法
    好了进入正题:

    代码如下(示例):

    /**
    	 * 导出评标表格PDF
    	 *
    	 * @author Sxing
    	 * @since 2020年11月5日09:24:56
    	 */
    	public void exportEvalFormPDF(HttpServletResponse resp, Long csId, String token) {
    		//验证token
    		ResultDTO<Object> validateDTO = validateToken(token);
    		if (validateDTO.isSuccess()) {
    			//生成评标表格符合性PDF(专家进行签字)
    			***createEvalFormPDF***(resp, csId);
    		}
    	}
    	/**
    	 * 生成评标表格符合性PDF导出
    	 * @param resp
    	 * @param csId
    	 */
    	private void createEvalFormPDF(HttpServletResponse resp, Long csId) {
    		CpSectionGetBO gsEntity = cpSectionServiceImpl.getById(csId).getData();
    		// 根据父级评标办法创建工作表
    		// 根据标段ID查询所有非价格得分的父级评标办法
    		List<CpSecEvalItemQueryBO> queryList = cpSecEvalItemServiceImpl.findUnPriceScoreParentByCsId(csId).getData();
    		List<OpenExcel> sheetList = new ArrayList<OpenExcel>();
    		// 设置工作表名称
    		OpenExcel evalSheetList = new OpenExcel();
    		evalSheetList.setSheetTitle("符合性");
    		// 最大列数
    		List<CpSecEvalResultSummaryBO> csersList;
    		int maxColumn = 0 ;
    		if (CollectionUtils.isNotEmpty(queryList)) {
    			for (CpSecEvalItemQueryBO queryBO : queryList) {
    				evalSheetList = ***createEvalResultSheetPDF***(evalSheetList, queryBO.getCseiId(), queryBO.getCseiName(), csId,
    						gsEntity.getCsName(), gsEntity.getCsCode(), 0);
    				// 查询开标成功的投标人信息
    				 csersList = findAllEvalBidder(queryBO.getCseiId(), csId);
    				 maxColumn = csersList.size() + 2;
    			}
    		}
    				//
    		try {
    			// 先导出到本地
    			String sdir = FileUploadProperty.getInstance().getRootPath() + File.separator;
    			String filePath = sdir + gsEntity.getCsName() + "评标表格.xls";
    			File file = new File(sdir);
    			if (!file.exists()) {
    				file.mkdirs();
    			}
    			excleExportUtil.exportToOpenExcel(filePath, "", evalSheetList);
    			InputStream input = new FileInputStream(filePath);
    			HSSFWorkbook workbook = new HSSFWorkbook(input);
    			// excel转换成pdf
    			String filePathPdf = xlsToPdf(workbook);
    			// 导出pdf文件
    			File pdfFile = new File(filePathPdf);
    			FileInputStream pdfIO = new FileInputStream(pdfFile);
    			byte[] io = new byte[1024 * 1024];
    			int len = -1;
    			// 设置导出格式
    			String excleName = gsEntity.getCsName()+"评标表格(符合性)";
    			resp.setContentType("application/pdf");
    			resp.addHeader("Content-Disposition",
    					"attachment;filename=" + new String(excleName.getBytes("UTF-8"), "ISO-8859-1") + ".pdf");
    			while ((len = pdfIO.read(io)) != -1) {
    				resp.getOutputStream().write(io, 0, len);
    			}
    			resp.getOutputStream().close();
    			pdfIO.close();
    			FileUtils.forceDelete(new File(filePath));
    			FileUtils.forceDelete(pdfFile);
    		} catch (Exception e) {
    			System.out.println("================================================导出失败=============================================================");
    			System.out.println(e);
    		}
    	}
    	
    	/**
    	 * 创建评标项的工作表
    	 *
    	 * @author Sxing
    	 * @since 2020年11月5日08:46:29
    	 */
    	private OpenExcel createEvalResultSheetPDF(OpenExcel evalSheetList, Long cseiId, String cseiName,
    			Long csId, String csName, String csCode, int sheetNo) {
    		// 查询开标成功的投标人信息
    		List<CpSecEvalResultSummaryBO> gadList = findAllEvalBidder(cseiId, csId);
    		List<CpSecEvalInfoBO> scoreList = new ArrayList<CpSecEvalInfoBO>();
    		List<CpSecEvalInfoBO> confirmList = new ArrayList<CpSecEvalInfoBO>();
    		for (CpSecEvalResultSummaryBO csersEntity : gadList) {
    			for (CpSecEvalInfoBO evalEntity : csersEntity.getList()) {
    				if (evalEntity.getCseiType() == CpEvalItemTypeEnum.CONFORM.getValue()) {
    					confirmList.add(evalEntity);
    				} else if (evalEntity.getCseiType() == CpEvalItemTypeEnum.SCORE.getValue()) {
    					scoreList.add(evalEntity);
    				}
    			}
    		}
    		// 创建符合性评标工作表
    		if (CollectionUtils.isNotEmpty(confirmList)) {
    			evalSheetList = ***createConformSheetPDF***(evalSheetList, cseiId, cseiName, csId, csName, csCode, sheetNo);
    			return evalSheetList;
    		}
    		return evalSheetList;
    	}
    		/**
    	 * 创建符合性评标类型的工作表格PDF
    	 *
    	 * @author Sxing
    	 * @since 2020年11月5日09:26:12
    	 */
    	public OpenExcel createConformSheetPDF(OpenExcel sheet, Long cseiId, String cseiName, Long csId, String csName,
    			String csCode, int sheetNo) {
    		sheet.setSheetTitle("符合性");
    		
    		
    		// 查询开标成功的投标人信息
    		List<CpSecEvalResultSummaryBO> csersList = findAllEvalBidder(cseiId, csId);
    		// 最大列数
    		int maxColumn = csersList.size() + 2;
    		// 设置工作表中的主标题、副标题
    		sheet = ***createSheetInnerTitle***(sheet, cseiName, csName, csCode, maxColumn);
    		// 设置表格数据标题列
    		OpenExcelRow tableHeadRow = new OpenExcelRow(sheet);
    		// 【序号】单元格
    		OpenExcelCell indexCell = new OpenExcelCell(tableHeadRow);
    		indexCell.setValue("序号");
    		// 【条款--投标人】单元格
    		OpenExcelCell itemCell = new OpenExcelCell(tableHeadRow);
    		itemCell.setValue("条款 投标人");
    		itemCell.setHaveLine(true);
    		// 【投标企业】单元格
    		for (CpSecEvalResultSummaryBO entity : csersList) {
    			OpenExcelCell gadCell = new OpenExcelCell(tableHeadRow);
    			gadCell.setValue(entity.getBidderCoName());
    		}
    
    		// 设置各列的数据值
    		int dataRow = 1;
    		int index = 0;
    		List<CpSecEvalInfoBO> list = new ArrayList<>();
    		for (int i = 0; i < csersList.size(); i++) {
    			if (csersList.get(i).getList().size() > 0) {
    				list = csersList.get(i).getList();
    				break;
    			}
    		}
    		for (CpSecEvalInfoBO evalEntity : list) {
    			if (evalEntity.getCseiType() == CpEvalItemTypeEnum.CONFORM.getValue()) {
    				OpenExcelRow tableDataRow = new OpenExcelRow(sheet);
    				// 【序号】单元格
    				OpenExcelCell indexDataCell = new OpenExcelCell(tableDataRow);
    				indexDataCell.setValue(dataRow);
    
    				// 评标办法名称、投标人符合项值
    				// 【评标办法名称】单元格
    				OpenExcelCell gseiNameCell = new OpenExcelCell(tableDataRow);
    				gseiNameCell.setValue(evalEntity.getCseiName());
    				for (CpSecEvalResultSummaryBO gadEntity : csersList) {
    					// 评标办法名称值单元格
    					OpenExcelCell gadItemValueCell = new OpenExcelCell(tableDataRow);
    					String value = "未参加";
    					if (CollectionUtils.isNotEmpty(gadEntity.getList())) {
    						if (gadEntity.getList().get(index).getConformResult() != null) {
    							value = gadEntity.getList().get(index).getConformResult() == ApYesNoEnum.YES.getValue()
    									? "符合"
    									: "不符合";
    						}
    					}
    
    					gadItemValueCell.setValue(value);
    
    				}
    				dataRow++;
    			}
    			index++;
    		}
    
    		// 结论行
    		OpenExcelRow conclusionsRow = new OpenExcelRow(sheet);
    
    		// 【序号】单元格
    		OpenExcelCell endIndexCell = new OpenExcelCell(conclusionsRow);
    		endIndexCell.setValue(dataRow);
    
    		// 【结论】单元格
    		OpenExcelCell conclusionCell = new OpenExcelCell(conclusionsRow);
    		conclusionCell.setValue("结论");
    
    		// 设置各评标项结论值
    		for (CpSecEvalResultSummaryBO entity : csersList) {
    			boolean flag = false;
    			for (CpSecEvalInfoBO evalEntity : entity.getList()) {
    				if (evalEntity.getCseiType() == CpEvalItemTypeEnum.CONFORM.getValue()) {
    					if (evalEntity.getConformResult() == null) {
    						break;
    					} else if (evalEntity.getConformResult() == ApYesNoEnum.YES.getValue()) {
    						flag = true;
    						break;
    					}
    				}
    			}
    			// 【结论值】单元格
    			OpenExcelCell conclusionValueCell = new OpenExcelCell(conclusionsRow);
    			conclusionValueCell.setValue(flag ? "合格" : "不合格");
    		}
    		// 结尾注释
    				OpenExcelRow remark1Row = new OpenExcelRow(sheet);
    
    				OpenExcelCell remark1Cell = new OpenExcelCell(remark1Row);
    				remark1Cell.setCellColumnSize(maxColumn);
    				remark1Cell.setValue("1、投标文件由法人代表签署时,可不提供法人授权书。");
    				remark1Cell.setAlignType(HorizontalAlignment.LEFT.getCode());
    
    				OpenExcelRow remark2Row = new OpenExcelRow(sheet);
    
    				OpenExcelCell remark2Cell = new OpenExcelCell(remark2Row);
    				remark2Cell.setCellColumnSize(maxColumn);
    				remark2Cell.setValue("2、表中只需填写“符合”、“不符合”。");
    				remark2Cell.setAlignType(HorizontalAlignment.LEFT.getCode());
    
    				OpenExcelRow remark3Row = new OpenExcelRow(sheet);
    
    				OpenExcelCell remark3Cell = new OpenExcelCell(remark3Row);
    				remark3Cell.setCellColumnSize(maxColumn);
    				remark3Cell.setValue("3、在结论栏中填写“合格”或“不合格”。");
    				remark3Cell.setAlignType(HorizontalAlignment.LEFT.getCode());
    
    				OpenExcelRow remark4Row = new OpenExcelRow(sheet);
    
    				OpenExcelCell remark4Cell = new OpenExcelCell(remark4Row);
    				remark4Cell.setCellColumnSize(maxColumn);
    				remark4Cell.setValue("签名:");
    				remark4Cell.setAlignType(HorizontalAlignment.LEFT.getCode());
    				return sheet;
    	}
    
    	/**
    	 * 设置工作表中的主标题、副标题
    	 *
    	 * @author Sxing
    	 * @since 2020年11月5日09:33:51
    	 */
    	private OpenExcel createSheetInnerTitle(OpenExcel sheet, String cseiName, String csName, String csCode,
    			int maxColumn) {
    		int cellColumnSize = 1;
    		if (maxColumn <= 0) {
    			throw new ServiceException("参数错误!");
    		}
    		if (maxColumn % 2 == 0) {
    			cellColumnSize = maxColumn / 2;
    		} else {
    			cellColumnSize = (maxColumn - 1) / 2;
    		}
    		// 主标题
    		// 创建主标题行
    		OpenExcelRow titleRow = new OpenExcelRow(sheet);
    		// 创建【主标题】单元格
    		OpenExcelCell mainCell = new OpenExcelCell(titleRow);
    		mainCell.setValue(cseiName);// 单元格内容
    		mainCell.setCellColumnSize(maxColumn);// 跨列数
    		mainCell.setCellStyle(OpenExcelStyleEnum.TITLE.getValue());
    		// 副标题
    		// 创建副标题行
    		OpenExcelRow subRow = new OpenExcelRow(sheet);
    		// 创建【副标题】单元格
    		OpenExcelCell subCell1 = new OpenExcelCell(subRow);
    		subCell1.setValue("采购项目子包名称:" + csName);// 单元格内容
    		subCell1.setCellColumnSize(cellColumnSize);// 跨列数
    		subCell1.setCellStyle(OpenExcelStyleEnum.SUB_TITLE.getValue());
    		OpenExcelCell subCell2 = new OpenExcelCell(subRow);
    		subCell2.setValue("采购项目子包名称:" + csCode);// 单元格内容
    		subCell2.setCellColumnSize(cellColumnSize);// 跨列数
    		subCell2.setCellStyle(OpenExcelStyleEnum.SUB_TITLE.getValue());
    		return sheet;
    	}
    	/**
    	 * excel转换成pdf
    	 *
    	 * @param: [workbook]
    	 * @return: java.lang.String
    	 * @author: MaPengfei
    	 * @since: 2019/5/15 17:56
    	 */
    	private String xlsToPdf(HSSFWorkbook workbook) throws IOException {
    		String filePathXls = FileUploadProperty.getInstance().getRootPath() + File.separator + "新专家签字打分.xls";
    		String filePathPdf = FileUploadProperty.getInstance().getRootPath() + File.separator + "专家签字打分.pdf";
    		File xlsFile = new File(filePathXls);
    		workbook.write(xlsFile);
    		Office2PdfUtils.excel2Pdf(filePathXls, filePathPdf);
    		FileUtils.forceDelete(xlsFile);
    		return filePathPdf;
    	}
    
    

    再次声明:注意不要直接复制,因为里面还有好多查询数据库的方法,逻辑不通的,根据自己的需求去查询 然后去做Excel表格的格式!!!

    3.service层以及后面就是查询数据库的方法了,这里就不展示了,基本做Excel表格和导出都在biz层了,这里给大家展示一下效果

    这是生成Excel的样式
    在这里插入图片描述

    生成后的PDF样式:
    在这里插入图片描述
    这样专家就可以在pdf上进行签字了,签字是客户端弄的哦~~不是我后台生成的!不归我管的,哈哈


    总结 (下一篇给大家写一个生成Excel多个sheet页的导出记得来看哦~) 好了没了到此结束!

    就是单纯记录一下 以后方便用 方便直接复制

    展开全文
  • 最近把数据导出为Excel文件并保存到本地,由于有很多功能都会用到导出功能,所以就简单封装了一个导出框架,分享给大家。 导出框架思路: 1.一个Map对应一条数据记录 2.多条数据存放在List对象中 3.为了简化...
  • 目录 背景描述 技术准备 导出Excel——尝鲜版 导出Excel——封装版(通过反射) 导出Excel——深度封装(设置下拉选项...最近博主在做的Web项目中,有一个导出数据到Excel表格的需求,之前用纯JS实现过,这次打算...
  • java项目中,会遇到读取或生成Excel文件的时候,我们来看两个可以实现这一功能的工具包:jxl和poi。 两种方式对比: 1. JXL只能对Excel进行操作,属于比较老的框架,它只支持到Excel 95-2000的版本。现在已经停止...
  • 目前java框架中能够生成excel文件的的确不少,但是,能够生成大数据量的excel框架,我倒是没发现,一般数据量大了都会出现内存溢出,所以,生成大数据量的excel文件要返璞归真,用java的基础技术,IO流来实现。...
  • 我使用的是Springboot框架开发的。首先需要在pom.xml文件中引入以下maven包: <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> ...
  • POI和JFreeChart框架实现生成Excel文件(生成 统计图)
  • JAVA操作EXCEL模板生成EXCEL方法: 可以和JSTL一样用,方便,快捷,简单] Java操作EXCEL (xls)模板生成EXCEL(xls)方法已经所需要的包
  • 主要介绍了Java Poi 在Excel中输出特殊符号的实现方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
  • java-SpringMVC框架导出Excel格式数据

    千次阅读 2017-12-19 16:13:02
    java-SpringMVC框架导出Excel格式数据
  • 打开生成加密的excel文件时用户名乱码: ![CSDN移动问答][1] ![CSDN移动问答][2] [1]: http://C:%5CUsers%5CAdministrator.DADI%5CDesktop%5CQQ%E6%88%AA%E5%9B%BE20130924165340.png
  • Java 生成Excel表格

    千次阅读 2016-03-31 11:29:12
    Java 生成Excel表格 使用jxl.jar在Java工程中生成Excel表格。jxl全程为:Java Excel,该API可以用来在Java中对微软的Excel表格进行操作。下面,我来简单地介绍下它的使用方法。 接着,编写excelUtil工具类,用于...
  • Java Excel数据导出方案及性能优化策略 --基于Apache poi框架 本文仅实现XSSF模式的Excel数据解析,HSSH模式的就不在重复了,跟XSSF的基本类似; 代码结构: maven依赖引入: <!-- POI --> ...
  • 产品经理需要导出一个页面的所有的信息到 EXCEL 文件。 需求分析 对于 excel 导出,是一个很常见的需求。 最常见的解决方案就是使用 poi 直接同步导出一个 excel 文件。 客户体验 &amp; 服务性能 客户体验 ...
  • POI的介绍 ...而我们Java中,也是提供了相应的操作办公软件的框架,其中,最常用的是下面两种: jxl:只能对Excel进行操作,属于比较老的框架。 POI:是apache的项目,可对ms的word,Excel,PPT进...
  • 1、新增对JDK9及以上版本Java环境的支持 2、生成JavaBean更名为生成数据模型并且提供了C#、C++、Golang、Rust、Python、Objective-C、Swift等编程语言数据模型的简单模板 3、新增生成SpringBoot项目工程的功能,...
  • 使用Java操作excel的几种方法

    千次阅读 多人点赞 2021-03-29 09:49:55
    在平时的业务系统开发中,少不了需要用到导出、导入excel功能,今天我们就一起来总结一下! 下面给大家介绍一下几种常用方法: 1、apache poi 2、easypoi 3、easyexcel
  • 项目简介 IExcel 用于优雅地读取和写入 excel 避免大 excel 出现 oom简约而不简单 特性 OO 的方式操作 excel编程更加方便优雅 sax 模式读取SXSS 模式写入避免 excel 大文件 OOM 基于注解编程更加灵活 写入可以基于...
  • java poi框架导出excel如何插入特殊字符(复选框勾选) 背景: google了好久java导出excel如何导出复选框勾选状态,没有找到可行的结果,实际操作了一下,要不就是导不出,要不就是导出之后不正确。 先看看要导出的...
  • 1.Java excel 生成多个二维码(java springboot框架) (1) 第一步: pom.xml 配置文件配置参数如下: <!-- 二维码 --> <dependency> <groupId>com.google.zxing</groupId> &...
  • 使用java实现 Excel在线预览

    千次阅读 2021-04-30 10:50:32
    收到需求的时候, java后端能不能生成个临时文件,然后展示到前台页面,前台只要能请求到后端,预览就生效了。 2 Do IT 2.1 引入pom文件 <dependency> <groupId>org.apache.poi</groupId...
  • java解析Excel的POI框架

    2010-05-31 21:41:26
    Jakarta POI 是apache的子项目,目标是处理ole2对象。它提供了一组操纵Windows文档的Java...它不象我们仅仅是用csv生成的没有格式的可以由Excel转换的东西,而是真正的Excel对象,你可以控制一些属性如sheet,cell等等。
  • java根据excel模板导出excel

    千次阅读 2019-11-29 09:41:08
    这两天在写用java使用excel模板导出excel的功能,从网上看了看资料都不是太满意,所以就趟了一次坑,并且记录 所需pom <dependency> <groupId>org.apache.poi</groupId> <artifactId>...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,045
精华内容 6,818
关键字:

java生成excel框架

java 订阅