java工具类之导出Excel

在我们的项目中经常会用到导出excel,这里就列举一下大家最常用到的导出EXCEL技术,在说一下自己设计的工具类。对POI不感兴趣的人,可以直接跳到最下面的工具类;

什么是Apache POI?

Apache POI是一种流行的API,它允许程序员使用Java程序创建,修改和显示MS Office文件。这由Apache软件基金会开发使用Java分布式设计或修改Microsoft Office文件的开源库。它包含类和方法对用户输入数据或文件到MS Office文档进行解码。

Apache POI组件

Apache POI包含类和方法,来将MS Office所有OLE 2文档复合。此API组件的列表如下。

  • POIFS (较差混淆技术实现文件系统) : 此组件是所有其他POI元件的基本因素。它被用来明确地读取不同的文件。

  • HSSF (可怕的电子表格格式) : 它被用来读取和写入MS-Excel文件的xls格式。

  • XSSF (XML格式) : 它是用于MS-Excel中XLSX文件格式。

  • HPSF (可怕的属性设置格式) : 它用来提取MS-Office文件属性设置。

  • HWPF (可怕的字处理器格式) : 它是用来读取和写入MS-Word的文档扩展名的文件。

  • XWPF (XML字处理器格式) : 它是用来读取和写入MS-Word的docx扩展名的文件。

  • HSLF (可怕的幻灯片版式格式) : 它是用于读取,创建和编辑PowerPoint演示文稿。

  • HDGF (可怕的图表格式) : 它包含类和方法为MS-Visio的二进制文件。

  • HPBF (可怕的出版商格式) : 它被用来读取和写入MS-Publisher文件.

  • Java Aspose Cells

    Java Aspose Cells 是一种纯粹的Java授权的Excel API,开发和供应商Aspose发布。这个API的最新版本是8.1.2,发布于2014年7月,是一个丰富而厚重的API(普通Java类和AWT类的组合)设计,可以读、写和操纵电子表格Excel的组件。此API常见用途如下:

    • Excel报表,建立动态Excel报表
    • 高保真的Excel渲染和打印
    • 从Excel电子表格中导入和导出数据
    • 生成,编辑,转换和电子表格

    JXL

    JXL是一款专为Selenium第三方框架,支持基于Web浏览器(数据是Web浏览器自动更新)数据驱动的自动化。然而,它也被用来作为JExcel API的一个共同的支持库,因为它的基本功能是可创建,读取和写入电子表格。基本特征如下:

    • 生成Excel文件
    • 从工作簿和电子表格导入数据
    • 获得行和列的总数

    注意:JXL只支持xls档案格式,并且不能处理大数据量。

    JExcel

    JExcel是由Team Dev开发提供纯行货API。利用这一点程序员可以很容易地读取,写入,显示和修改Excel工作簿中的两种格式:.xls和.XLSX。这个API可以很容易地嵌入Java的Swing和AWT。这个API的最新版本是Jexcel-2.6.12,发布于2009年,主要特点如下。

    • 自动化Excel应用程序,工作簿,工作表等
    • 在Java Swing应用程序作为普通的Swing组件嵌入到工作簿
    • 事件侦听器添加到工作簿和电子表格
    • 添加事件处理程序来处理的工作簿和电子表格事件的行为
    • 添加本地对等开发定制功能

    Apache POI

    Apache POI是Apache软件基金会提供的100%开源库。大多数中小规模的应用程序开发主要依赖于Apache POI(HSSF+ XSSF)。它支持Excel 库的所有基本功能; 然而,呈现和文本提取是它的主要特点。

    这是创建或维护Excel工作簿的所有类的超接口。它属于org.apache.poi.ss.usermodel包。是实现此接口的两个类,如下所示:

    • HSSFWorkbook : 这个类有读取和.xls 格式和写入Microsoft Excel文件的方法。它与微软Office97-2003版本兼容。

    • XSSFWorkbook : 这个类有读写Microsoft Excel和OpenOffice的XML文件的格式.xls或.xlsx的方法。它与MS-Office版本2007或更高版本兼容。

    HSSFWorkbook

    它是在org.apache.poi.hssf.usermodel包的高层次的类。它实现了Workbook 接口,用于Excel文件中的.xls格式。下面列出的是一些本类下的方法和构造函数。

    类的构造函数

    S.No. 构造函数和说明
    1

    HSSFWorkbook()

    从头开始创建一个新的HSSFWorkbook对象时。

    2

    HSSFWorkbook(DirectoryNode directory, boolean preserveNodes)

    创建一个特定的目录中一个新的HSSFWworkbook对象。

    3

    HSSFWorkbook(DirectoryNode directory, POIFSFileSystem fs, boolean preserveNodes)

    给定一个POIFSFileSystem对象和特定的目录中,它创建了一个SSFWorkbook对象读取指定的工作簿。

    4

    HSSFWorkbook(java.io.InputStream s)

    创建使用输入流中的新HSSFWorkbook对象时。

    5

    HSSFWorkbook(java.io.InputStream s, boolean preserveNodes)

    构建在输入流的POI文件系统。

    6

    HSSFWorkbook(POIFSFileSystem fs)

    使用POIFSFileSystem对象构造的新HSSFWorkbook对象时。

    7

    HSSFWorkbook(POIFSFileSystem fs, boolean preserveNodes)

    给定一个POIFSFileSystem对象时,它会创建一个新的HSSFWorkbook对象时读取指定的工作簿。

    这些构造内的常用参数:

    • directory : 这是从POI文件系统处理的目录。

    • fs :它是包含簿流该POI的文件系统。

    • preservenodes : 这是决定是否保留其他节点像宏的可选参数。它消耗大量的内存,因为它存储在内存中的所有POIFileSystem(如果设置)。

    注意:HSSFWorkbook类包含了许多方法;然而,它们仅与XLS格式兼容。在本教程中,重点是在Excel文件格式的最新版本。因此,HSSFWorkbook类的方法,这里没有列出。如果需要这些类的方法,那么请参照POI-HSSFWorkbook类API在 https://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFWorkbook.html.

    XSSFWorkbook

    它是用于表示高和低层次Excel文件格式的类。它属于org.apache.xssf.usemodel包,并实现Workbook接口。下面列出的是这个类的方法和构造函数。

    类的构造函数

    S.No. 构造函数和说明
    1

    XSSFWorkbook()

    从头开始创建一个新的XSSFworkbook对象。

    2

    XSSFWorkbook(java.io.File file)

    构造从给定文件中的XSSFWorkbook对象。

    3

    XSSFWorkbook(java.io.InputStream is)

    构造一个XSSFWorkbook对象,通过缓冲整个输入流到内存中,然后为它打开一个OPCPackage对象。

    4

    XSSFWorkbook(java.lang.String path)

    构建一个给定文件的完整路径的XSSFWorkbook对象。

    类方法

    S.No. 方法及描述
    1

    createSheet()

    创建一个XSSFSheet本工作簿,将其添加到表,并返回高层表示。

    2

    createSheet(java.lang.String sheetname)

    创建此工作簿的新表,并返回高层表示。

    3

    createFont()

    创建一个新的字体,并将其添加到工作簿的字体表。

    4

    createCellStyle()

    创建一个新的XSSFCellStyle并将其添加到工作簿的样式表。

    5

    createFont()

    创建一个新的字体,并将其添加到工作簿的字体表。

    6

    setPrintArea(int sheetIndex, int startColumn, int endColumn, int startRow,int endRow)

    设置一个给定的表按照指定参数的打印区域。

    对于此类的其余的方法,请参阅完整的API文档:http://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFWorkbook.html. 列出了所有方法。

    Sheet

    Sheet是在org.apache.poi.ss.usermodel包的接口,它是创建具有特定名称的高或低级别的电子表格的所有类的超接口。电子表格的最常见的类型是工作表,它被表示为单元的网格。

    HSSFSheet

    这是在org.apache.poi.hssf.usermodel包的类。它可以创建Excel电子表格,它允许在sheet 方式和表数据格式。

    类的构造函数

    S.No. 构造函数及描述
    1

    HSSFSheet(HSSFWorkbook workbook)

    创建新HSSFSheet通过调用HSSFWorkbook从头开始创建一个表。

    2

    HSSFSheet(HSSFWorkbook workbook, InternalSheet sheet)

    创建HSSFSheet表示给定表对象。

    XSSFSheet

    这是代表了Excel电子表格的高级别代表的一类。这在org.apache.poi.hssf.usermodel包下。

    类的构造函数

    S.No. 构造函数及描述
    1

    XSSFSheet()

    创造了新的XSSFSheet- 调用XSSFWorkbook从头开始创建一个表。

    2

    XSSFSheet(PackagePart part, PackageRelationship rel)

    创建XSSFSheet表示给定包的一部分和关系。

    类方法

    S.No. 方法和描述
    1

    addMergedRegion(CellRangeAddress region)

    添加单元的合并区域(因此这些单元格合并形成一个)。

    2

    autoSizeColumn(int column)

    调整列宽,以适应的内容。

    3

    iterator()

    此方法是用于rowIterator()的别名,以允许foreach循环

    4

    addHyperlink(XSSFHyperlink hyperlink)

    注册超链接的集合中的超链接此工作表格上

    对于此类的其余的方法,请参阅完整的API在:
    https://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFSheet.html.

    这是在org.apache.poi.ss.usermodel包的接口。它是用于一排的电子表格的高层表示。它是代表了POI库的行所有类的超接口。

    XSSFRow

    这是在org.apache.poi.xssf.usermodel包的类。它实现了Row接口,因此它可以在电子表格中创建行。下面列出的是这个类在方法和构造函数。

    类方法

    S.No. 描述
    1

    createCell(int columnIndex)

    创建新单元行并返回。

    2

    setHeight(short height)

    设置短单位的高度。

    对于此类的其余的方法,参考如下链接:
    https://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFRow.html

    单元格

    这是在org.apache.poi.ss.usermodel包的接口。它是代表了单元在电子表格中的行中的所有类的超接口。

    单元格可以使用各种属性,例如空白,数字,日期,错误等单元格被添加到一个行之前应具有(基于0)自己的编号。

    XSSFCell

    这是在 org.apache.poi.xssf.usermodel 包的类。它实现了单元格界面。它是单元在电子表格中的行的一个高层次的表示。

    字段摘要

    下面列出的是一些XSSFCell类的字段以及它们的描述。

    单元格类型 描述
    CELL_TYPE_BLANK 代表空白单元格
    CELL_TYPE_BOOLEAN 代表布尔单元(true或false)
    CELL_TYPE_ERROR 表示在单元的误差值
    CELL_TYPE_FORMULA 表示一个单元格公式的结果
    CELL_TYPE_NUMERIC 表示对一个单元的数字数据
    CELL_TYPE_STRING 表示对一个单元串(文本)

    类方法

    S.No. 描述
    1

    setCellStyle(CellStyle style)

    为单元格设置样式。

    2

    setCellType(int cellType)

    设置单元格的类型(数字,公式或字符串)。

    3

    setCellValue(boolean value)

    设置单元格一个布尔值

    4

    setCellValue(java.util.Calendar value)

    设置一个日期值的单元格。

    5

    setCellValue(double value)

    设置为单元格的数值。

    6

    setCellValue(java.lang.String str)

    设置为单元格的字符串值。

    7

    setHyperlink(Hyperlink hyperlink)

    分配超链接到该单元格。

    对于这个类的剩余方法和字段,请访问以下链接查看详细:
    https://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFCell.html

    XSSFCellStyle

    这是在org.apache.poi.xssf.usermodel包的类。它将提供关于在电子表格的单元格中的内容的格式可能的信息。它也提供了用于修正该格式的选项。它实现了CellStyle接口。

    字段摘要

    下表列出了从CellStyle接口继承一些字段。

    字段名称 字段描述
    ALIGN_CENTER 中心对齐单元格内容
    ALIGN_CENTER_SELECTION 中心选择水平对齐方式
    ALIGN_FILL 单元格适应于内容的大小
    ALIGN_JUSTIFY 适应单元格内容的宽度
    ALIGN_LEFT 左对齐单元格内容
    ALIGN_RIGHT 右对齐单元格内容
    BORDER_DASH_DOT 使用破折号和点单元格样式
    BORDER_DOTTED 用虚线边框的单元格样式
    BORDER_DASHED 用虚线边框的单元格样式
    BORDER_THICK 厚厚的边框单元格样式
    BORDER_THIN 薄边框的单元格样式
    VERTICAL_BOTTOM 对齐单元格内容的垂直下方
    VERTICAL_CENTER 对齐单元格内容垂直居中
    VERTICAL_JUSTIFY 对齐和垂直对齐的单元格内容
    VERTICAL_TOP 顶部对齐为垂直对齐

    类的构造函数

    S.No. 构造函数及描述
    1

    XSSFCellStyle(int cellXfId, int cellStyleXfId, StylesTable stylesSource, ThemesTable theme)

    创建一个单元格样式,从所提供的部分

    2

    XSSFCellStyle(StylesTable stylesSource)

    创建一个空的单元样式

    类方法

    设置边框的类型为单元格的底部边界

    S.No 方法及描述
    1

    setAlignment(short align)

    设置单元格为水平对齐的类型

    2

    setBorderBottom(short border)

    3

    setBorderColor(XSSFCellBorder.BorderSide side, XSSFColor color)

    选定的边框颜色

    4

    setBorderLeft(Short border)

    设置边界的类型单元格的左边框

    5

    setBorderRight(short border)

    设置边框的类型为单元格的右边界

    6

    setBorderTop(short border)

    设置边界的类型的单元上边框

    7

    setFillBackgroundColor(XSSFColor color)

    设置表示为XSSFColor值背景填充颜色。

    8

    setFillForegroundColor(XSSFColor color)

    设置表示为XSSFColor的值前景填充颜色。

    9

    setFillPattern(short fp)

    指定单元格的填充信息模式和纯色填充单元。

    10

    setFont(Font font)

    设置此样式的字体。

    11

    setRotation(short rotation)

    设置的旋转为在单元格中文本的程度。

    12

    setVerticalAlignment(short align)

    设置单元类型为垂直取向

    对于这个类剩下的方法和字段,通过以下链接:
    https://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFCellStyle.html

    HSSFColor

    这是在org.apache.poi.hssf.util包的类。它提供了不同的颜色作为嵌套类。通常这些嵌套类是使用自己的索引来表示。它实现了Color接口。

    嵌套类

    所有嵌套类这个类是静态的,每个类都有其索引。这些嵌套色类用于单元格格式,如单元格内容,边框,前景和背景。下面列出了一些的嵌套类。

    S.No. 类名(颜色)
    1 HSSFColor.AQUA
    2 HSSFColor.AUTOMATIC
    3 HSSFColor.BLACK
    4 HSSFColor.BLUE
    5 HSSFColor.BRIGHT_GREEN
    6 HSSFColor.BRIGHT_GRAY
    7 HSSFColor.CORAL
    8 HSSFColor.DARK_BLUE
    9 HSSFColor.DARK_GREEN
    10 HSSFColor.SKY_BLUE
    11 HSSFColor.WHITE
    12 HSSFColor.YELLOW

    类方法

    这个类的只有一个方法是很重要的,并且用于获取索引值。

    S.No. 方法和描述
    1

    getIndex()

    这种方法被用来获得一个嵌套类的索引值

    对于其余的方法和嵌套类,请参阅以下链接:
    https://poi.apache.org/apidocs/org/apache/poi/hssf/util/HSSFColor.html.

    XSSFColor

    这是在org.apache.poi.xssf.usermodel包的类。它是用来表示在电子表格中的颜色。它实现了颜色的接口。下面列出的是它的一些方法和构造函数。

    类的构造函数

    S.No. Constructor and 描述
    1

    XSSFColor()

    创建XSSFColor的新实例。

    2

    XSSFColor(byte[] rgb)

    创建XSSFColor使用RGB的新实例。

    3

    XSSFColor(java.awt.Color clr)

    创建XSSFColor使用Color类从AWT包的新实例。

    类方法

    S.No. 方法和描述
    1

    setAuto(boolean auto)

    设置一个布尔值,表示ctColor是自动的,系统ctColor依赖。

    2

    setIndexed(int indexed)

    设置索引ctColor值系统ctColor。

    对于其余的方法,请访问以下链接:
    https://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFColor.html.

    XSSFFont

    这是在org.apache.poi.xssf.usermodel包的类。它实现了Font接口,因此它可以处理工作簿中不同的字体。

    类的构造函数

    S.No. 构造函数和描述
    1

    XSSFFont()

    创建一个新的XSSFont实例。

    类方法

    S.No. 方法和描述
    1

    setBold(boolean bold)

    设置“bold”属性的布尔值。

    2

    setColor(short color)

    设置索引颜色的字体。

    3

    setColor(XSSFColor color)

    设置为标准Alpha RGB颜色值的字体颜色。

    4

    setFontHeight(short height)

    设置在点的字体高度。

    5

    setFontName(java.lang.String name)

    设置字体的名称。

    6

    setItalic(boolean italic)

    设置“italic”属性一个布尔值。

    对于其余的方法,通过以下链接:
    https://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFFont.html.

    XSSFHyperlink

    这是在org.apache.poi.xssf.usermodel包的类。它实现了Hyperlink接口。它是用来连结设置为电子表格的单元格内容。

    字段

    属于此类的字段如下。这里,字段意味着使用超链接的类型。

    字段 描述
    LINK_DOCUMENT 用于连接任何其他文件
    LINK_EMAIL 用于链接的电子邮件
    LINK_FILE 用于以任何格式链接任何其他文件
    LINK_URL 用来连接一个网页URL

    类方法

    S.No. 方法及描述
    1

    setAddress(java.lang.String address)

    超链接地址。

    对于其余的方法,请访问以下链接:
    https://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFHyperlink.html

    XSSFCreationHelper

    这是在org.apache.poi.xssf.usermodel包的类。它实现了CreationHelper接口。它被用作公式求值和设置超文本链接支持类。

    类方法

    S.No. 方法和描述
    1

    createFormulaEvaluator()

    创建一个XSSFFormulaEvaluator例如,结果计算公式的单元格的对象。

    2

    createHyperlink(int type)

    Creates a new XSSFHyperlink.

    对于其余的方法,请参考以下链接:https://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFCreationHelper.html.

    XSSFPrintSetup

    这是在org.apache.poi.xsssf.usermodel包下的类。它实现了PrintSetup接口。它是用来设置打印页面大小,面积,选项和设置。

    类方法

    S.No. 方法及说明
    1

    setLandscape(boolean ls)

    设置一个布尔值,允许或阻止横向打印。

    2

    setLeftToRight(boolean ltor)

    设置是否向左走向右或自上而下的顺序,同时打印。

    3

    setPaperSize(short size)

    设置纸张尺寸。


    每个系统附带一个很大的字体如 Arial, Impact, Times New Roman,等字体集合也可以用新的字体更新,如果需要的话。同样也有各种风格,其中的字体可以显示,例如,粗体,斜体,下划线,删除线等。

    字体和字体样式

    下面的代码用于特定的字体和样式应用于一单元格的内容。

    import java.io.File;
    import java.io.FileOutputStream;
    import org.apache.poi.hssf.util.HSSFColor;
    import org.apache.poi.xssf.usermodel.XSSFCell;
    import org.apache.poi.xssf.usermodel.XSSFCellStyle;
    import org.apache.poi.xssf.usermodel.XSSFFont;
    import org.apache.poi.xssf.usermodel.XSSFRow;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    public class FontStyle 
    {
       public static void main(String[] args)throws Exception 
       {
          XSSFWorkbook workbook = new XSSFWorkbook(); 
          XSSFSheet spreadsheet = workbook.createSheet("Fontstyle");
          XSSFRow row = spreadsheet.createRow(2);
          //Create a new font and alter it.
          XSSFFont font = workbook.createFont();
          font.setFontHeightInPoints((short) 30);
          font.setFontName("IMPACT");
          font.setItalic(true);
          font.setColor(HSSFColor.BRIGHT_GREEN.index);
          //Set font into style
          XSSFCellStyle style = workbook.createCellStyle();
          style.setFont(font);
          // Create a cell with a value and set style to it.
          XSSFCell cell = row.createCell(1);
          cell.setCellValue("Font Style");
          cell.setCellStyle(style);
          FileOutputStream out = new FileOutputStream(
          new File("fontstyle.xlsx"));
          workbook.write(out);
          out.close();
          System.out.println(
          "fontstyle.xlsx written successfully");
       }
    }
    

    让我们保存上面的代码在一个名为FontStyle.java文件。从命令提示符编译并执行它如下。

    $javac FontStyle.java
    $java FontStyle
    

    它生成一个名为fontstyle.xlsx在当前目录中的Excel文件并显示在命令提示符处键入以下输出。

    fontstyle.xlsx written successfully
    

    fontstyle.xlsx文件如下所示。

    java工具类之导出Excel_第1张图片

    文字方向

    在这里,可以学习如何设置不同角度的文本方向。通常单元格的内容以水平方式显示,由左到右,并在00角;但是可以使用下面的代码来旋转文本的方向(如果需要的话)。

    import java.io.File;
    import java.io.FileOutputStream;
    import org.apache.poi.xssf.usermodel.XSSFCell;
    import org.apache.poi.xssf.usermodel.XSSFCellStyle;
    import org.apache.poi.xssf.usermodel.XSSFRow;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    public class TextDirection 
    {
       public static void main(String[] args)throws Exception 
       {
          XSSFWorkbook workbook = new XSSFWorkbook(); 
          XSSFSheet spreadsheet = workbook.createSheet(
          "Text direction");
          XSSFRow row = spreadsheet.createRow(2);
          XSSFCellStyle myStyle = workbook.createCellStyle();
          myStyle.setRotation((short) 0);
          XSSFCell cell = row.createCell(1);
          cell.setCellValue("0D angle");
          cell.setCellStyle(myStyle);
          //30 degrees
          myStyle=workbook.createCellStyle();
          myStyle.setRotation((short) 30);
          cell = row.createCell(3);
          cell.setCellValue("30D angle");
          cell.setCellStyle(myStyle);
          //90 degrees
          myStyle=workbook.createCellStyle();
          myStyle.setRotation((short) 90);
          cell = row.createCell(5);
          cell.setCellValue("90D angle");
          cell.setCellStyle(myStyle);
          //120 degrees
          myStyle=workbook.createCellStyle();
          myStyle.setRotation((short) 120);
          cell = row.createCell(7);
          cell.setCellValue("120D angle");
          cell.setCellStyle(myStyle);
          //270 degrees
          myStyle = workbook.createCellStyle();
          myStyle.setRotation((short) 270);
          cell = row.createCell(9);
          cell.setCellValue("270D angle");
          cell.setCellStyle(myStyle);
          //360 degrees
          myStyle=workbook.createCellStyle();
          myStyle.setRotation((short) 360);
          cell = row.createCell(12);
          cell.setCellValue("360D angle");
          cell.setCellStyle(myStyle);
          FileOutputStream out = new FileOutputStream(
          new File("textdirection.xlsx"));
          workbook.write(out);
          out.close();
          System.out.println( 
          "textdirection.xlsx written successfully");
       }
    }
    

    保持TextDirectin.java文件上面的代码,然后编译并从命令提示符如下执行它。

    $javac TextDirection.java
    $java TextDirection
    

    这将编译和执行,以生成一个名为textdirection.xlsx在当前目录中的Excel文件并显示在命令提示符处键入以下输出。

    textdirection.xlsx written successfully
    

    面的代码演示如何创建单元格的超链接。

    import java.io.File;
    import java.io.FileOutputStream;
    import org.apache.poi.common.usermodel.Hyperlink;
    import org.apache.poi.hssf.util.HSSFColor;
    import org.apache.poi.ss.usermodel.CreationHelper;
    import org.apache.poi.xssf.usermodel.XSSFCell;
    import org.apache.poi.xssf.usermodel.XSSFCellStyle;
    import org.apache.poi.xssf.usermodel.XSSFFont;
    import org.apache.poi.xssf.usermodel.XSSFHyperlink;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    public class HyperlinkEX 
    {
       public static void main(String[] args) throws Exception 
       {
          XSSFWorkbook workbook = new XSSFWorkbook(); 
          XSSFSheet spreadsheet = workbook
          .createSheet("Hyperlinks");
          XSSFCell cell;
          CreationHelper createHelper = workbook
          .getCreationHelper();
          XSSFCellStyle hlinkstyle = workbook.createCellStyle();
          XSSFFont hlinkfont = workbook.createFont();
          hlinkfont.setUnderline(XSSFFont.U_SINGLE);
          hlinkfont.setColor(HSSFColor.BLUE.index);
          hlinkstyle.setFont(hlinkfont);
          //URL Link
          cell = spreadsheet.createRow(1)
          .createCell((short) 1);
          cell.setCellValue("URL Link");
          XSSFHyperlink link = (XSSFHyperlink)createHelper
          .createHyperlink(Hyperlink.LINK_URL);
          link.setAddress("http://www.yiibai.com/" );
          cell.setHyperlink((XSSFHyperlink) link);
          cell.setCellStyle(hlinkstyle);
          //Hyperlink to a file in the current directory
          cell = spreadsheet.createRow(2)
          .createCell((short) 1);
          cell.setCellValue("File Link");
          link = (XSSFHyperlink)createHelper
          .createHyperlink(Hyperlink.LINK_FILE);
          link.setAddress("cellstyle.xlsx");
          cell.setHyperlink(link);
          cell.setCellStyle(hlinkstyle);
          //e-mail link
          cell = spreadsheet.createRow(3)
          .createCell((short) 1);
          cell.setCellValue("Email Link");
          link = (XSSFHyperlink)createHelper
          .createHyperlink(Hyperlink.LINK_EMAIL);
          link.setAddress( 
          "mailto:[email protected]?"
          +"subject=Hyperlink");
          cell.setHyperlink(link);
          cell.setCellStyle(hlinkstyle);
          FileOutputStream out = new FileOutputStream(
          new File("hyperlink.xlsx"));
          workbook.write(out);
          out.close();
          System.out.println("hyperlink.xlsx written successfully");
       }
    }
    

    保存上面的代码到文件HyperlinkEX.java。并从命令提示符编译执行它如下。

    $javac HyperlinkEX.java
    $java HyperlinkEX
    

    它会生成一个名为hyperlink.xlsx在当前目录中的Excel文件并显示在命令提示符处输出:

    hyperlink.xlsx written successfully
    

    hyperlink.xlsx文件如下所示。


  • 注以上内容转载自http://www.yiibai.com/apache_poi/apache_poi_hyperlink.html

  • 下面将说一下自己设计的工具类;

  • 工具类一般有两种,一种是页面使用表单提交,后台接收参数,然后去数据库查询出来结果,再导出下载;另外一种是页面是一个按钮点击出发js事件,js拼装一个ifram,在ifram里面发一个URL请求,并且封装参数

  • 1:表单提交

  • </form>
    			<form id="excelForm" method="post" action="../../manage/orderExportExcel.do">
    			<input id="orderCode" name="ids" value="" type="hidden">
    	    <div align="center"><button  id="btn" class="btn btn-info" >批量导出</button></div>
        </form>
    public class ExcelUtil {
    
    	/**
    	 * 功能描述:excel生成工具
    	 */
    	public static <T> void toExcelOutStream(OutputStream out,
    			String codedFileName, List<ExcelVo> header, List<T> datas,HttpServletResponse response,String path) {
    		try {
    			String oldCodedFileName = codedFileName;
    			// 产生工作簿对象
    			SXSSFWorkbook workbook = new SXSSFWorkbook(100);
    			// 产生工作表对象
    			int sheetNum = 1;
    			Sheet sheet = workbook
    					.createSheet(codedFileName + "-" + sheetNum++);
    			// 进行转码,使其支持中文文件名
    			codedFileName = java.net.URLEncoder
    					.encode(codedFileName
    							+ DateUtils
    									.getNowTime("yyyy_MM_dd_hh_mm_ss"),
    							"UTF-8");
    			generateExcelHeader(sheet, header, workbook);
    			// 插入数据
    			Field field;
    			int sheetLength = 0;
    			int rowNum = 1;
    			for (int i = 1; i <= datas.size(); i++) {
    				T obj = datas.get(i - 1);
    				if (obj != null) {
    					// 加入超过单个Sheet的最大长度,则新城一个新的sheet页
    					sheetLength++;
    					if (sheetLength >= 65535) {
    						sheetLength = 0;
    						rowNum = 1;
    						sheet = workbook.createSheet(oldCodedFileName + "-"
    								+ sheetNum++);
    						generateExcelHeader(sheet, header, workbook);
    					}
    					Row row = sheet.createRow(rowNum++);// 创建一行
    					for (int j = 0; j < header.size(); j++) {
    						Cell cell = row.createCell(j);// 创建一列
    						cell.setCellType(header.get(j).getRowType());
    						field = obj.getClass().getDeclaredField(
    								header.get(j).getRowNameEg());
    						field.setAccessible(true);Object value=new Object();
    						if(field.get(obj)!=null&&!"".equals(field.get(obj))){
    						if(field.getType().getSimpleName().equals("Date")){
    							 value = field.get(obj);
    							 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd H:m:s");
    							 value=format.format(value);
    
    						}else{
    							value = field.get(obj);
    						}
    						setCellValue(cell, value, header.get(j).getRowType());
    					}
    					}
    				}
    			}
    			workbook.write(out);
    			out.flush();
    			download(path, response);
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			try {
    				if (out != null) {
    					out.close();
    				}
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    
    	private static void generateExcelHeader(Sheet sheet, List<ExcelVo> header,
    			SXSSFWorkbook workbook) {
    		// 单元格样式
    		CellStyle headerStyle = workbook.createCellStyle();
    		// 字体样式
    		Font font = workbook.createFont();
    		font.setFontHeightInPoints((short) 12);
    		font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
    		headerStyle.setFont(font);
    		// 生成头行
    		if (header != null && header.size() > 0) {
    			Row row = sheet.createRow(0);// 创建一行
    			for (int i = 0; i < header.size(); i++) {
    				Cell cell = row.createCell(i);// 创建一列
    				cell.setCellType(header.get(i).getRowType());
    				cell.setCellValue(header.get(i).getRowNameCn());
    				cell.setCellStyle(headerStyle);
    				sheet.setColumnWidth(i, header.get(i).getCellWith());
    			}
    		}
    	}
    
    	/** 
    	 * @param response
    	 *            响应流
    	 * @param codedFileName
    	 *            文件名称,默认生成时间戳格式
    	 * @param header
    	 *            头行数据
    	 * @param datas
    	 *            表格数据
    	 */
    	public static <T> void toExcelOutStream(HttpServletResponse response,
    			String codedFileName, List<ExcelVo> header, List<T> datas) {
    		// 生成提示信息,
    		response.setContentType("application/vnd.ms-excel");
    		response.setHeader("content-disposition", "attachment;filename="
    				+ codedFileName);
    		try {
    			toExcelOutStream(response.getOutputStream(), codedFileName, header,
    					datas,response,null);
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    	public static void excel(HttpServletResponse response) throws FileNotFoundException{
    		FileOutputStream file=new FileOutputStream("C:\\Users\\liaoyongguang\\student1.xls");
    		List ls=new ArrayList();
    		List<ExcelVo> le=new ArrayList<ExcelUtil.ExcelVo>();
    		for(int i=0;i<=5;i++){
    			Student st=new Student("张三"+i,i,"湖北襄阳"+i);
    			ls.add(st);
    		}
    		ExcelVo ev=new ExcelVo("姓名",HSSFCell.CELL_TYPE_STRING, "name");
    		ExcelVo ev1=new ExcelVo("年龄",HSSFCell.CELL_TYPE_STRING, "age");
    		ExcelVo ev2=new ExcelVo("地址",HSSFCell.CELL_TYPE_STRING, "address");
    		le.add(ev);
    		le.add(ev1);
    		le.add(ev2);
    		
    	}
    	/**
    	 * @param cell
    	 *            单元格
    	 * @param value
    	 *            值
    	 * @param cellType
    	 *            单元格类型 设置单元格的值
    	 */
    	private static void setCellValue(Cell cell, Object value, int cellType) {
    		if (cellType == HSSFCell.CELL_TYPE_STRING) {
    			cell.setCellValue(String.valueOf(value));
    		} else if (cellType == HSSFCell.CELL_TYPE_NUMERIC) {
    			cell.setCellValue((Double) value);
    		} else if (cellType == HSSFCell.CELL_TYPE_BOOLEAN) {
    			cell.setCellValue((Boolean) value);
    		} else if (cellType == HSSFCell.CELL_TYPE_BLANK) {
    			cell.setCellValue("");
    		}
    	}
    	/*/
    	 * 以下载的方式读取excel
    	 */
    	private static void download(String path, HttpServletResponse response) {
    		try {
    			// path是指欲下载的文件的路径。
    			File file = new File(path);
    			// 取得文件名。
    			String filename = file.getName();
    			// 以流的形式下载文件。
    			InputStream fis = new BufferedInputStream(new FileInputStream(path));
    			byte[] buffer = new byte[fis.available()];
    			fis.read(buffer);
    			fis.close();
    			// 清空response
    			response.reset();
    			// 设置response的Header
    			response.addHeader("Content-Disposition", "attachment;filename="
    					+ new String(filename.getBytes()));
    			response.addHeader("Content-Length", "" + file.length());
    			OutputStream toClient = response.getOutputStream();
    			response.setContentType("application/vnd.ms-excel");
    //			contentDisposition
    			toClient.write(buffer);
    			toClient.flush();
    			toClient.close();
    		} catch (IOException ex) {
    			ex.printStackTrace();
    		}
    	}
    
    	/**
    	 * @Author 
    	 * @Date 下午3:30:28 生成excel所需的头信息
    	 */
    	public static class ExcelVo {
    		public ExcelVo(String rowNameCn, int rowType, String rowNameEg) {
    			this.rowNameCn = rowNameCn;
    			this.rowNameEg = rowNameEg;
    			this.rowType = rowType;
    		}
    
    		/**
    		 * 字段中文描述
    		 */
    		private String rowNameCn;
    		/**
    		 * 字段类型
    		 * */
    		private int rowType;
    		/**
    		 * 字段名
    		 * */
    		private String rowNameEg;
    		/**
    		 * 列宽
    		 * */
    		private int cellWith = 25 * 256;
    
    		public String getRowNameCn() {
    			return rowNameCn;
    		}
    
    		public void setRowNameCn(String rowNameCn) {
    			this.rowNameCn = rowNameCn;
    		}
    
    		public int getRowType() {
    			return rowType;
    		}
    
    		public void setRowType(int rowType) {
    			this.rowType = rowType;
    		}
    
    		public String getRowNameEg() {
    			return rowNameEg;
    		}
    
    		public void setRowNameEg(String rowNameEg) {
    			this.rowNameEg = rowNameEg;
    		}
    
    		public int getCellWith() {
    			return cellWith;
    		}
    
    		public void setCellWith(int cellWith) {
    			this.cellWith = cellWith;
    		}
    
    	}
    
    }

    里面有一个方法叫download,此方法会以下载的方式读取excel,但是有一个缺点就是他会去先以流的形式读取excel,然后再以下载的方式去读取,这样效率会比较低,所以不是很推荐

  • 第二种方法,以iframe的方式提交请求

  • $scope.queryStationExport=function(type){
    		var exportframe = $('<iframe style="display:none"/>');
    		$scope.queryContent.agreementType=type;
    		var url = encodeURI(encodeURI("signingRead/queryStationExport.do?resVo=" +JSON.stringify($scope.queryContent)));
    		exportframe.attr({'src': url});
    		$('body').append(exportframe);
    	};

    这里会把我们拼装的参数转换为stirng,在action的话,用string去接收,再转换成实体类;

  • @RequestMapping(value="queryLeagueExport")
    	@ResponseBody
    	public Object queryLeagueExport(@RequestParam String resVo,HttpServletRequest request,
    			HttpServletResponse response) throws Exception{
    		String str = URLDecoder.decode(resVo);
    		Vo Vo = JsonUtils.JsonStringToObject(str, Vo.class);
    		return successReturnObject(signingReadManage.queryStationExport(request, response, Vo));
    	}

    工具类

  • 	/**
    	 * @param fileName 文件名
    	 * @param is 文件流
    	 * @param cl 类对象
    	 * @return 
    	 * @throws IOException 异常
    	 */
    	public static <E> List<E> readExcelData(String fileName,InputStream is,Class<E> cl,ExcelRowDataCheck dataCheck,List<String> errorMsgList) throws Exception{
    		List<E> resultList=new ArrayList<E>();
    		Field[] fields = cl.getDeclaredFields();
    		//判断excel版本,并处理
    		if(isExcel2003(fileName)){
    			parseExcel2003Data(resultList, is, cl,fields,dataCheck,errorMsgList);
    		}else if(isExcel2007(fileName)){
    			parseExcel2007Data(resultList, is, cl,fields,dataCheck,errorMsgList);
    		}
    		return resultList;
    	}
    	
    	/**
    	 * @param resultList 结果集
    	 * @param is 文件流
    	 * @param cl 类对象
    	 * @return
    	 * @throws IOException IO异常
    	 */
    	private static <E> void parseExcel2003Data(List<E> resultList,InputStream is,Class<E> cl,Field[] fields,ExcelRowDataCheck dataCheck,List<String> errorMsgList) throws Exception{
    		POIFSFileSystem fs=new POIFSFileSystem(is);
    		HSSFWorkbook wb=new HSSFWorkbook(fs);
    		int sheetCount = wb.getNumberOfSheets();
    		for(int i=0;i<sheetCount;i++){
    			readSheetData(resultList, wb.getSheetAt(i), cl,fields,dataCheck,errorMsgList);
    		}
    	}
    	
    	/**
    	 * @param resultList 结果集
    	 * @param is 文件流
    	 * @param cl 类对象
    	 * @return
    	 * @throws IOException IO异常
    	 */
    	private static <E> void parseExcel2007Data(List<E> resultList,InputStream is,Class<E> cl,Field[] fields,ExcelRowDataCheck dataCheck,List<String> errorMsgList) throws Exception{
    		XSSFWorkbook xwb =new XSSFWorkbook(is);
    		int sheetCount = xwb.getNumberOfSheets();
    		for(int i=0;i<sheetCount;i++){
    			readSheetData(resultList, xwb.getSheetAt(i), cl,fields,dataCheck,errorMsgList);
    		}
    	}
    	
    	/**
    	 * @param result 结果列表
    	 * @param sheet sheet对象
    	 * @param cl 类对象
    	 * @throws IllegalAccessException 
    	 * @throws Exception 
    	 */
    	private static <E> void readSheetData(List<E> resultList,Sheet sheet,Class<E> cl,Field[] fields,ExcelRowDataCheck dataCheck,List<String> errorMsgList) throws Exception{
    		if(sheet!=null){
    			int rows=sheet.getPhysicalNumberOfRows();
    			if(rows>0){
    				Row row=null;
    				Cell cell=null;	
    				for (int i = 1; i < rows; i++) {
    					row=sheet.getRow(i);
    					if(row!=null){//全部
    						E e = cl.newInstance(); 
    						for(int n=0;n<fields.length;n++){
    							Field f = fields[n];
    							cell = row.getCell(n);
    							if(cell != null){
    								cell.setCellType(Cell.CELL_TYPE_STRING);
    								f.setAccessible(true);
    								f.set(e, cell.getStringCellValue());
    							}
    							//setDataValue(f.getType(), cell.getCellType(), cell, f, e);
    						}
    						StringBuffer buffer = new StringBuffer("SheetName:"+sheet.getSheetName()+",RowNumber:"+row.getRowNum());
    						if(!dataCheck.checkRow(buffer, e,row.getRowNum())){
    							errorMsgList.add(buffer.toString());
    						}else{
    							resultList.add(e);
    						}
    					}
    				}
    			}
    		}
    	}
    	
    	/**
    	 * @param cell
    	 *            单元格
    	 * @param value
    	 *            值
    	 * @param cellType
    	 *            单元格类型 设置单元格的值
    	 * @throws IllegalAccessException 
    	 * @throws IllegalArgumentException 
    	 */
    	private static <E> void setDataValue(Object fieldType,int cellType,Cell cell,Field f,E e) throws Exception {
    		if (fieldType instanceof String) {
    			cell.setCellType(Cell.CELL_TYPE_STRING);
    			f.set(e, cell.getStringCellValue());
    		} else if (fieldType instanceof BigDecimal || fieldType instanceof Integer) {
    			cell.setCellType(Cell.CELL_TYPE_NUMERIC);
    			f.set(e, cell.getNumericCellValue());
    		} else if (fieldType instanceof Boolean) {
    			cell.setCellType(Cell.CELL_TYPE_NUMERIC);
    			f.set(e, cell.getBooleanCellValue());
    		}
    	}
    	
    	public static boolean isExcel2003(String filePath){  
            return filePath.matches("^.+\\.(?i)(xls)$");  
        }  
    	
    	public static boolean isExcel2007(String filePath){  
            return filePath.matches("^.+\\.(?i)(xlsx)$");
        }
    	
    	/**
    	 * 功能描述:excel生成工具
    	 */
    	public static <T> void toExcelOutStream(OutputStream out,
    			String codedFileName, List<ExcelVo> header, List<T> datas) {
    		try {
    			String oldCodedFileName = codedFileName;
    			// 产生工作簿对象
    			SXSSFWorkbook workbook = new SXSSFWorkbook(100);
    			// 产生工作表对象
    			int sheetNum = 1;
    			Sheet sheet = workbook
    					.createSheet(codedFileName + "-" + sheetNum++);
    			// 进行转码,使其支持中文文件名
    			codedFileName = java.net.URLEncoder
    					.encode(codedFileName
    							+ DateUtils.getCurrentDateStrByFormat(DateUtils.TIMESTAMP_MSECS),
    							"UTF-8");
    			generateExcelHeader(sheet, header, workbook);
    			// 插入数据
    			Field field;
    			int sheetLength = 0;
    			int rowNum = 1;
    			for (int i = 1; i <= datas.size(); i++) {
    				T obj = datas.get(i - 1);
    				if (obj != null) {
    					// 加入超过单个Sheet的最大长度,则新城一个新的sheet页
    					sheetLength++;
    					if (sheetLength >= 65535) {
    						sheetLength = 0;
    						rowNum = 1;
    						sheet = workbook.createSheet(oldCodedFileName + "-"
    								+ sheetNum++);
    						generateExcelHeader(sheet, header, workbook);
    					}
    					Row row = sheet.createRow(rowNum++);// 创建一行
    					for (int j = 0; j < header.size(); j++) {
    						Cell cell = row.createCell(j);// 创建一列
    						cell.setCellType(header.get(j).getRowType());
    						field = obj.getClass().getDeclaredField(
    								header.get(j).getRowNameEg());
    						field.setAccessible(true);
    						Object value=new Object();
    						if(field.get(obj)!=null&&!"".equals(field.get(obj))){
    						if(field.getType().getSimpleName().equals("Date")){
    							 value = field.get(obj);
    							 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd H:m:s");
    							 value=format.format(value);
    
    						}else{
    							value = field.get(obj);
    						}
    						setCellValue(cell, value, header.get(j).getRowType());
    						}
    					}
    				}
    			}
    			workbook.write(out);
    			out.flush();
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			try {
    				if (out != null) {
    					out.close();
    				}
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    	
    	public static void generateExcelHeader(Sheet sheet, List<ExcelVo> header,
    			SXSSFWorkbook workbook) {
    		// 单元格样式
    		CellStyle headerStyle = workbook.createCellStyle();
    		// 字体样式
    		Font font = workbook.createFont();
    		font.setFontHeightInPoints((short) 12);
    		font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
    		headerStyle.setFont(font);
    		// 生成头行
    		if (header != null && header.size() > 0) {
    			Row row = sheet.createRow(0);// 创建一行
    			for (int i = 0; i < header.size(); i++) {
    				Cell cell = row.createCell(i);// 创建一列
    				cell.setCellType(header.get(i).getRowType());
    				cell.setCellValue(header.get(i).getRowNameCn());
    				cell.setCellStyle(headerStyle);
    				sheet.setColumnWidth(i, header.get(i).getCellWith());
    			}
    		}
    	}
    
    	/**
    	 * @param response
    	 *            响应流
    	 * @param codedFileName
    	 *            文件名称,默认生成时间戳格式
    	 * @param header
    	 *            头行数据
    	 * @param datas
    	 *            表格数据
    	 */
    	public static <T> void toExcelOutStream(HttpServletResponse response,
    			String codedFileName, List<ExcelVo> header, List<T> datas) {
    		// 生成提示信息,
    		response.setContentType("application/vnd.ms-excel");
    		response.setHeader("content-disposition", "attachment;filename="
    				+ codedFileName + ".xlsx");
    		try {
    			toExcelOutStream(response.getOutputStream(), codedFileName, header,
    					datas);
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    
    	/**
    	 * @param cell
    	 *            单元格
    	 * @param value
    	 *            值
    	 * @param cellType
    	 *            单元格类型 设置单元格的值
    	 */
    	public static void setCellValue(Cell cell, Object value, int cellType) {
    		if (cellType == HSSFCell.CELL_TYPE_STRING) {
    			cell.setCellValue(String.valueOf(value));
    		} else if (cellType == HSSFCell.CELL_TYPE_NUMERIC) {
    			cell.setCellValue((Double) value);
    		} else if (cellType == HSSFCell.CELL_TYPE_BOOLEAN) {
    			cell.setCellValue((Boolean) value);
    		} else if (cellType == HSSFCell.CELL_TYPE_BLANK) {
    			cell.setCellValue("");
    		}
    	}
    
    	/**
    	 * @Author 
    	 * @Date 下午3:30:28 生成excel所需的头信息
    	 */
    	public static class ExcelVo {
    		public ExcelVo(String rowNameCn, int rowType, String rowNameEg) {
    			this.rowNameCn = rowNameCn;
    			this.rowNameEg = rowNameEg;
    			this.rowType = rowType;
    		}
    
    		/**
    		 * 字段中文描述
    		 */
    		private String rowNameCn;
    		/**
    		 * 字段类型
    		 * */
    		private int rowType;
    		/**
    		 * 字段名
    		 * */
    		private String rowNameEg;
    		/**
    		 * 列宽
    		 * */
    		private int cellWith = 25 * 256;
    
    		public String getRowNameCn() {
    			return rowNameCn;
    		}
    
    		public void setRowNameCn(String rowNameCn) {
    			this.rowNameCn = rowNameCn;
    		}
    
    		public int getRowType() {
    			return rowType;
    		}
    
    		public void setRowType(int rowType) {
    			this.rowType = rowType;
    		}
    
    		public String getRowNameEg() {
    			return rowNameEg;
    		}
    
    		public void setRowNameEg(String rowNameEg) {
    			this.rowNameEg = rowNameEg;
    		}
    
    		public int getCellWith() {
    			return cellWith;
    		}
    
    		public void setCellWith(int cellWith) {
    			this.cellWith = cellWith;
    		}
    
    	}














你可能感兴趣的:(java工具类之导出Excel)