精华内容
下载资源
问答
  • java的POI相关操作问题

    2019-07-25 15:33:20
    java使用POI怎么动态设置下载xlsx表模板单元格为必填项,并加以提示
  • 我在用JAVA的POI读写word,如果我找到某些段落,想把这些段落重新生成一个word文件应该如何操作呢(用range的原因是我想保留原始word里头的格式,例如粗斜体)?比如说: HWPFDocument doc = new HWPFDocument(fs)...
  • java的POI操作excel文件

    千次阅读 2013-08-06 06:11:21
    java的POI操作Excel文件【原文地址:http://www.blogjava.net/hezhi/articles/POI.html】  微软在桌面系统上的成功,令我们不得不大量使用它的办公产品,如:Word,Excel。时至今日,它的源代码仍然不公开已封锁了...
    
    

    java的POI操作Excel文件【原文地址:http://www.blogjava.net/hezhi/articles/POI.html

        微软在桌面系统上的成功,令我们不得不大量使用它的办公产品,如:WordExcel。时至今日,它的源代码仍然不公开已封锁了我们的进一步应用和开发。然而在要求更高的服务器领域,微软本身的产品移植性不好, 

        性能不佳。在我们实际的开发中,表现层的解决方案虽然有多样,但是Ie浏览器已成为最多人使用的浏览器,因为大家都用Windows。在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开。或者是:我们已经习惯用Excel打印。这样子如果用.net开发是没有问题的,但是有j2ee这个比.net更有前途的开放式的开发环境,难道我为了解决打印的要求去另写客户端的控件?或者在服务器端使用本地代码?第一种方案的问题是关键数据的处理有时候不能在客户端做,第2种方案的问题是牺牲了代码的可移植性和稳定性。如果让客户端只负责处理生成好的报表,那将是一种诱人的选择。

        ApacheJakata项目的POI子项目,目标是处理ole2对象。目前比较成熟的是HSSF接口,处理MS Excel97-2002)对象。它不象我们仅仅是用csv生成的没有格式的可以由Excel转换的东西,而是真正的Excel对象,你可以控制一些属性如sheet,cell等等。这是一个年轻的项目,所以象HDF这样直接支持Word对象的好东西仍然在设计中。其它支持word格式的纯java方案还有itext,不过也是仍在奋斗中。但是HSSF已经成熟到能够和足够我们使用了。另外,无锡永中Office的实现方案也是纯java的解决方案,不过那也是完全商业的产品,并不是公开代码项目。其实,从开发历史的角度讲,在80年代中期starOffice的原作者在德国成立了StarOffice suite公司,然后到1999年夏天starOfficesun收购,再到20006starOffice5.2的发布;并且从starOffice6.0开始,starOffice建立在OpenOfficeapi的基础上,这个公开代码的office项目已经进行了很长的时间。虽然那是由C++写的,但是POI的代码部分也是由openOffice改过来的。所以,应该对POI充满足够的信心。国内已经有部分公司在他们的办公自动化等Web项目中使用poi了,如日恒的ioffice,海泰的HTOffice等。

        java当初把核心处理设成Unicode,带来的好处是另代码适应了多语言环境。然而由于老外的英语只有26个字母,有些情况下,一些程序员用8位的byte处理,一不小心就去掉了CJK的高位。或者是由于习惯在程序中采用硬编码,还有多种原因,使得许多java应用在CJK的处理上很烦恼。还好在POI HSSF中考虑到这个问题,可以设置encoding为双字节。

        POI可以到www.apache.org下载到。编译好的jar主要有这样4个:poi,poi Browser,poi hdf,poi hssf例程包。实际运行时,需要有poi包就可以了。如果用Jakarta ant编译和运行,下载apache Jakarta POIrelease中的src包,它里面已经为你生成好了build文件了。只要运行ant就可以了(ant 的安装和使用在此不说了)。如果是用Jbuilder 运行,请在新建的项目中加入poi包。以Jbuilder6为例,选择Tools菜单项的config libraries...选项,新建一个lib。在弹出的菜单中选择poi包,如这个jakarta-poi-1.5.1-final-20020820.jar,把poi添加到jbuilder中。然后,右键点击你的项目,在projectproperties菜单中pathrequired Libraries中,点add,添加刚才加入到jbuilder中的poi到你现在的项目中。如果你仅仅是为了熟悉POI hssf的使用,可以直接看POIsamples包中的源代码,并且运行它。hssf的各种对象都有例程的介绍。hssf提供的例程在org.apache.poi.hssf.usermodel.examples包中,共有14个,生成的目标xls都是workbook.xls。如果你想看更多的例程,可以参考hssfJunit test cases,在poi的包的源代码中有。hssf都有测试代码。

        这里只对部分例程的实现做介绍。

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

            HSSFWorkbook excell的文档对象

            HSSFSheet excell的表单

            HSSFRow excell的行

            HSSFCell excell的格子单元

            HSSFFont excell字体

            HSSFName 名称

            HSSFDataFormat 日期格式

        在poi1.7中才有以下2项:

            HSSFHeader sheet

            HSSFFooter sheet

        和这个样式

            HSSFCellStyle cell样式

        辅助操作包括

            HSSFDateUtil 日期

            HSSFPrintSetup 打印

            HSSFErrorConstants 错误信息表

        仔细看org.apache.poi.hssf包的结构,不难发现HSSF的内部实现遵循的是MVC模型。

        这里我用Roseorg.apache.poi.hssf.usermodel包中的对象反向导入并根据相互关系作了整理。从中不难可以发现每一个基本对象都关联了一个Record对象。Record对象是一个参考Office格式的相关记录。

        HSSFWorkbook即是一个Excell对象。这幅类图体现的是HSSFWorkbook和基本对象的相互关系。可见,许多对象中也建立了Workbook的引用。还需要注意的是在HSSFWorkbookHSSFSheet中建立了log机制POILogger,而且POILogger也是使用apache Log4J实现的。

        先看poiexamples包中提供的最简单的例子,建立一个空xls文件。

        

     1import org.apache.poi.hssf.usermodel.HSSFWorkbook;
     2
     3import java.io.FileOutputStream;
     4
     5import java.io.IOException;
     6
     7public class NewWorkbook{
     8
     9public static void main(String[] args) throws IOException{
    10
    11        HSSFWorkbook wb = new HSSFWorkbook();//建立新HSSFWorkbook对象
    12
    13        FileOutputStream fileOut = new FileOutputStream("workbook.xls");
    14
    15        wb.write(fileOut);//把Workbook对象输出到文件workbook.xls中
    16
    17        ileOut.close();
    18
    19    }

    20}

        

        通过这个例子,我们建立的是一个空白的xls文件(不是空文件)。在此基础上,我们可以进一步看其它的例子。

     1import org.apache.poi.hssf.usermodel.*;
     2
     3import java.io.FileOutputStream;
     4
     5import java.io.IOException;
     6
     7public class CreateCells
     8
     9{
    10
    11    public static void main(String[] args)
    12
    13    throws IOException
    14
    15    {
    16
    17        HSSFWorkbook wb = new HSSFWorkbook();// 建立新HSSFWorkbook对象
    18
    19        HSSFSheet sheet = wb.createSheet("new sheet");// 建立新的sheet对象
    20
    21        // Create a row and put some cells in it. Rows are 0 based.
    22
    23        HSSFRow row = sheet.createRow((short0);// 建立新行
    24
    25        // Create a cell and put a value in it.
    26
    27        HSSFCell cell = row.createCell((short0);// 建立新cell
    28
    29        cell.setCellValue(1);// 设置cell的整数类型的值
    30
    31        // Or do it on one line.
    32
    33        row.createCell((short1).setCellValue(1.2);// 设置cell浮点类型的值
    34
    35        row.createCell((short2).setCellValue("test");// 设置cell字符类型的值
    36
    37        row.createCell((short3).setCellValue(true);// 设置cell布尔类型的值
    38
    39        HSSFCellStyle cellStyle = wb.createCellStyle();// 建立新的cell样式
    40
    41        cellStyle.setDataFormat(HSSFDataFormat.getFormat("m/d/yy h:mm"));// 设置cell样式为定制的日期格式---我在poi3.9里面试了一下,报错说没有这个方法
    42
    43        HSSFCell dCell = row.createCell((short4);
    44
    45        dCell.setCellValue(new Date());// 设置cell为日期类型的值
    46
    47        dCell.setCellStyle(cellStyle); // 设置该cell日期的显示格式
    48
    49        HSSFCell csCell = row.createCell((short5);
    50
    51        csCell.setEncoding(HSSFCell.ENCODING_UTF_16);// 设置cell编码解决中文高位字节截断---找不到这个方法
    52
    53        csCell.setCellValue("中文测试_Chinese Words Test");// 设置中西文结合字符串
    54
    55        row.createCell((short6).setCellType(HSSFCell.CELL_TYPE_ERROR);// 建立错误cell
    56
    57        // Write the output to a file
    58
    59        FileOutputStream fileOut = new FileOutputStream("workbook.xls");
    60
    61        wb.write(fileOut);
    62
    63        fileOut.close();
    64
    65    }

    66
    67}


        我稍微修改了原来的examples包中的CreateCells类写了上面的功能测试类。通过这个例子,我们可以清楚的看到xls文件从大到小包括了HSSFWorkbook HSSFSheet HSSFRow HSSFCell这样几个对象。我们可以在cell中设置各种类型的值。尤其要注意的是如果你想正确的显示非欧美的字符时,尤其象中日韩这样的语言,必须设置编码为16位的即是HSSFCell.ENCODING_UTF_16,才能保证字符的高8位不被截断而引起编码失真形成乱码。

        其他测试可以通过参考examples包中的测试例子掌握poi的详细用法,包括字体的设置,cell大小和低纹的设置等。需要注意的是POI是一个仍然在完善中的公开代码的项目,所以有些功能正在不断的扩充。如HSSFSheetgetFooter() getHeader()setFooter(HSSFFooter hsf) setHeader(HSSFHeader hsh)是在POI1.7中才有的,而POI1.5中就没有。运行测试熟悉代码或者使用它做项目时请注意POI的版本。

        另外需要注意的是HSSF也有它的对xls基于事件的解析。可以参考例程中的EventExample.java。它通过实现HSSFListener完成从普通流认知Xls中包含的内容,在apache Cocoon中的org.apache.cocoon.serialization.HSSFSerializer中用到了这个解析。因为Cocoon2是基于事件的,所以POI为了提供快速的解析也提供了相应的事件。当然我们自己也可以实现这个事件接口。

    因为POI还不是一个足够成熟的项目,所以有必要做进一步的开发和测试。但是它已经为我们用纯java操作ole2对象提供了可能,而且克服了ole对象调用的缺陷,提供了服务器端的Excel解决方案。

        

        为了保证示例程序的运行,必须安装Java 2 sdk1.4.0 Jakarta POIJakarta POIWeb站点是: http://jakarta.apache.org/poi/

        
        示例1将演示
        如何利用
    Jakarta POI API 创建Excel 文档。
       

     1import org.apache.poi.hssf.usermodel.HSSFWorkbook;
     2import org.apache.poi.hssf.usermodel.HSSFSheet;
     3import org.apache.poi.hssf.usermodel.HSSFRow;
     4import org.apache.poi.hssf.usermodel.HSSFCell;
     5import java.io.FileOutputStream;
     6public class CreateXL {
     7 /** Excel 文件要存放的位置,假定在D盘JTest目录下*/
     8 public static String outputFile="D:/JTest/ gongye.xls";
     9 public static void main(String argv[]){
    10     try{
    11      // 创建新的Excel 工作簿
    12      HSSFWorkbook workbook = new HSSFWorkbook();
    13      // 在Excel工作簿中建一工作表,其名为缺省值
    14      // 如要新建一名为"效益指标"的工作表,其语句为:
    15      // HSSFSheet sheet = workbook.createSheet("效益指标");
    16      HSSFSheet sheet = workbook.createSheet();
    17      // 在索引0的位置创建行(最顶端的行)
    18      HSSFRow row = sheet.createRow((short)0);
    19      //在索引0的位置创建单元格(左上端)
    20      HSSFCell cell = row.createCell((short0);
    21      // 定义单元格为字符串类型
    22      cell.setCellType(HSSFCell.CELL_TYPE_STRING);
    23      // 在单元格中输入一些内容
    24      cell.setCellValue("增加值");
    25      // 新建一输出文件流
    26      FileOutputStream fOut = new FileOutputStream(outputFile);
    27      // 把相应的Excel 工作簿存盘
    28      workbook.write(fOut);
    29      fOut.flush();
    30      // 操作结束,关闭文件
    31      fOut.close();
    32      System.out.println("文件生成");
    33    
    34    
    35     }
    catch(Exception e) {
    36      System.out.println("已运行 xlCreate() : " + e );
    37     }

    38    }

    39}


    读取Excel文档中的数据
      示例2将演示如何读取Excel文档中的数据。假定在DJTest目录下有一个文件名为gongye.xlsExcel文件。

      示例2程序如下:

     

     1import org.apache.poi.hssf.usermodel.HSSFWorkbook;
     2import org.apache.poi.hssf.usermodel.HSSFSheet;
     3import org.apache.poi.hssf.usermodel.HSSFRow;
     4import org.apache.poi.hssf.usermodel.HSSFCell;
     5import java.io.FileInputStream;
     6public class ReadXL {
     7 /** Excel文件的存放位置。注意是正斜线*/
     8 public static String fileToBeRead="D:/JTest/ gongye.xls";
     9 public static void main(String argv[])
    10 try{
    11  // 创建对Excel工作簿文件的引用
    12  HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(fileToBeRead));
    13  // 创建对工作表的引用。
    14  // 本例是按名引用(让我们假定那张表有着缺省名"Sheet1")
    15  HSSFSheet sheet = workbook.getSheet("Sheet1");
    16  // 也可用getSheetAt(int index)按索引引用,
    17  // 在Excel文档中,第一张工作表的缺省索引是0,
    18  // 其语句为:HSSFSheet sheet = workbook.getSheetAt(0);
    19  // 读取左上端单元
    20  HSSFRow row = sheet.getRow(0);
    21  HSSFCell cell = row.getCell((short)0);
    22  // 输出单元内容,cell.getStringCellValue()就是取所在单元的值
    23  System.out.println("左上端单元是: " + cell.getStringCellValue()); 
    24 }
    catch(Exception e) {
    25  System.out.println("已运行xlRead() : " + e );
    26 }

    27}

     设置单元格格式

      在这里,我们将只介绍一些和格式设置有关的语句,我们假定workbook就是对一个工作簿的引用。在Java中,第一步要做的就是创建和设置字体和单元格的格式,然后再应用这些格式:

        

        1、创建字体,设置其为红色、粗体:

    1HSSFFont font = workbook.createFont();
    2font.setColor(HSSFFont.COLOR_RED);
    3font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

     

        2、创建格式

    1HSSFCellStyle cellStyle= workbook.createCellStyle();
    2cellStyle.setFont(font);

     
        3、应用格式 

     

    1HSSFCell cell = row.createCell((short0);
    2cell.setCellStyle(cellStyle);
    3cell.setCellType(HSSFCell.CELL_TYPE_STRING);
    4cell.setCellValue("标题 ");

     

        总之,如本篇文章所演示的一样,Java程序员不必担心Excel工作表中的数据了,利用Jakarta POI API我们就可以轻易的在程序中存取Excel文档。

     

        总结说说现在我所知道的Java编辑Excel文件的两大开源工具:

        jakarta POIJavaExcelAPI(简称JXL),这两套工具我都试用了一这段时间,感觉各有优劣吧。POI在某些细节有些小Bug并且不支持写入图片,其他方面都挺不错的;

    JXL就惨了,除了支持写入图片外,我暂时看不到它比POI好的地方,我碰到的主要的问题就是对公式支持不是很好,很多带有公式的Excel文件用JXL打开后,公式就丢失了(比如now(),today()),在网上看到其他大虾评论说JXL写入公式也有问题,另外,JXL操作Excel文件的效率比POI低一点。经过比较后,我选择了POI开发我的项目。

    展开全文
  • 如下代码可以实现使用Java的POI进行Word文档的解析并生成XML格式文档功能

        如下代码可以实现使用Java的POI进行Word文档的解析并生成XML格式文档功能,此代码编译通过,但是运行有问题,读者可以亲自试试并能否改bug:


    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.OutputStreamWriter;
    import java.io.Writer;
    import java.nio.charset.Charset;
    
    import org.apache.poi.hwpf.HWPFDocument;
    import org.apache.poi.hwpf.model.StyleDescription;
    import org.apache.poi.hwpf.model.StyleSheet;
    import org.apache.poi.hwpf.usermodel.CharacterRun;
    import org.apache.poi.hwpf.usermodel.Paragraph;
    import org.apache.poi.hwpf.usermodel.Range;
    
    public final class Word2Forrest {
    	Writer _out;
    	HWPFDocument _doc;
    
    	@SuppressWarnings("unused")
    	public Word2Forrest(HWPFDocument doc, OutputStream stream) throws IOException {
    		OutputStreamWriter out = new OutputStreamWriter(stream, Charset.forName("UTF-8"));
    		_out = out;
    		_doc = doc;
    
    		init();
    		openDocument();
    		openBody();
    
    		Range r = doc.getRange();
    		StyleSheet styleSheet = doc.getStyleSheet();
    
    		int sectionLevel = 0;
    		int lenParagraph = r.numParagraphs();
    		boolean inCode = false;
    		for (int x = 0; x < lenParagraph; x++) {
    			Paragraph p = r.getParagraph(x);
    
    			String text = p.text();
    			if (text.trim().length() == 0) {
    				continue;
    			}
    			StyleDescription paragraphStyle = styleSheet.getStyleDescription(p.getStyleIndex());
    			String styleName = paragraphStyle.getName();
    			if (styleName.startsWith("Heading")) {
    				if (inCode) {
    					closeSource();
    					inCode = false;
    				}
    
    				int headerLevel = Integer.parseInt(styleName.substring(8));
    				if (headerLevel > sectionLevel) {
    					openSection();
    				} else {
    					for (int y = 0; y < (sectionLevel - headerLevel) + 1; y++) {
    						closeSection();
    					}
    					openSection();
    				}
    				sectionLevel = headerLevel;
    				openTitle();
    				System.out.println("++++++" + p.text());
    				writePlainText(text);
    				closeTitle();
    			} else {
    				int cruns = p.numCharacterRuns();
    				CharacterRun run = p.getCharacterRun(0);
    				String fontName = run.getFontName();
    				if (fontName.startsWith("Courier")) {
    					if (!inCode) {
    						openSource();
    						inCode = true;
    					}
    					System.out.println("------" + p.text());
    					writePlainText(p.text());
    				} else {
    					if (inCode) {
    						inCode = false;
    						closeSource();
    					}
    					openParagraph();
    					System.out.println("******" + p.text());
    					writePlainText(p.text());
    					closeParagraph();
    				}
    			}
    		}
    		for (int x = 0; x < sectionLevel; x++) {
    			closeSection();
    		}
    		closeBody();
    		closeDocument();
    		_out.flush();
    
    	}
    
    	public void init() throws IOException {
    		_out.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
    		_out.write(
    				"<!DOCTYPE document PUBLIC \"-//APACHE//DTD Documentation V1.1//EN\" \"./dtd/document-v11.dtd\">\r\n");
    	}
    
    	public void openDocument() throws IOException {
    		_out.write("<document>\r\n");
    	}
    
    	public void closeDocument() throws IOException {
    		_out.write("</document>\r\n");
    	}
    
    	public void openBody() throws IOException {
    		_out.write("<body>\r\n");
    	}
    
    	public void closeBody() throws IOException {
    		_out.write("</body>\r\n");
    	}
    
    	public void openSection() throws IOException {
    		_out.write("<section>");
    
    	}
    
    	public void closeSection() throws IOException {
    		_out.write("</section>");
    
    	}
    
    	public void openTitle() throws IOException {
    		_out.write("<title>");
    	}
    
    	public void closeTitle() throws IOException {
    		_out.write("</title>");
    	}
    
    	public void writePlainText(String text) throws IOException {
    		_out.write(text);
    	}
    
    	public void openParagraph() throws IOException {
    		_out.write("<p>");
    	}
    
    	public void closeParagraph() throws IOException {
    		_out.write("</p>");
    	}
    
    	public void openSource() throws IOException {
    		_out.write("<source><![CDATA[");
    	}
    
    	public void closeSource() throws IOException {
    		_out.write("]]></source>");
    	}
    
    	public static void main(String[] args) throws IOException {
    		InputStream is = new FileInputStream("D:/QMDownload/hwpftest.doc");
    		OutputStream out = new FileOutputStream("D:/QMDownload/test.xml");
    		try {
    			new Word2Forrest(new HWPFDocument(is), out);
    		} finally {
    			out.close();
    			is.close();
    		}
    	}
    }


    展开全文
  • java的poi技术读取Excel[xls,xlsx]

    千次阅读 2016-09-01 17:52:38
    java的poi技术读取Excel[xls,xlsx]

    首先感谢博客园大神 Hongten
    原文地址:http://www.cnblogs.com/hongten/p/java_poi_excel_xls_xlsx.html

    (最近项目需要对excel进行操作,所以在网上找到了这篇博文,并且很好的应用到了项目中,在此做个记录。)

    这篇blog主要是讲述java中poi读取excel,而excel的版本包括:2003-2007和2010两个版本, 即excel的后缀名为:xls和xlsx。

    读取excel和MySQL相关: java的poi技术读取Excel数据到MySQL

    你也可以在 : java的poi技术读取和导入Excel 了解到写入Excel的方法信息

    使用JXL技术 : java的jxl技术导入Excel

    下面是本文的项目结构:

    这里写图片描述

    项目中所需要的jar文件:

    这里写图片描述

    所用的Excel数据(2003-2007,2010都是一样的数据)

    这里写图片描述

    运行效果:

    这里写图片描述

    源码部分:

    =================================================

    /Excel2010/src/com/b510/common/Common.java

    /**
     * 
     */
    package com.b510.common;
    
    /**
     * @author Hongten
     * @created 2014-5-21
     */
    public class Common {
    
        public static final String OFFICE_EXCEL_2003_POSTFIX = "xls";
        public static final String OFFICE_EXCEL_2010_POSTFIX = "xlsx";
    
        public static final String EMPTY = "";
        public static final String POINT = ".";
        public static final String LIB_PATH = "lib";
        public static final String STUDENT_INFO_XLS_PATH = LIB_PATH + "/student_info" + POINT + OFFICE_EXCEL_2003_POSTFIX;
        public static final String STUDENT_INFO_XLSX_PATH = LIB_PATH + "/student_info" + POINT + OFFICE_EXCEL_2010_POSTFIX;
        public static final String NOT_EXCEL_FILE = " : Not the Excel file!";
        public static final String PROCESSING = "Processing...";
    
    }

    /Excel2010/src/com/b510/excel/ReadExcel.java

    /**
     * 
     */
    package com.b510.excel;
    
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    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 com.b510.common.Common;
    import com.b510.excel.util.Util;
    import com.b510.excel.vo.Student;
    
    /**
     * @author Hongten
     * @created 2014-5-20
     */
    public class ReadExcel {
    
        /**
         * read the Excel file
         * @param path the path of the Excel file
         * @return
         * @throws IOException
         */
        public List<Student> readExcel(String path) throws IOException {
            if (path == null || Common.EMPTY.equals(path)) {
                return null;
            } else {
                String postfix = Util.getPostfix(path);
                if (!Common.EMPTY.equals(postfix)) {
                    if (Common.OFFICE_EXCEL_2003_POSTFIX.equals(postfix)) {
                        return readXls(path);
                    } else if (Common.OFFICE_EXCEL_2010_POSTFIX.equals(postfix)) {
                        return readXlsx(path);
                    }
                } else {
                    System.out.println(path + Common.NOT_EXCEL_FILE);
                }
            }
            return null;
        }
    
        /**
         * Read the Excel 2010
         * @param path the path of the excel file
         * @return
         * @throws IOException
         */
        public List<Student> readXlsx(String path) throws IOException {
            System.out.println(Common.PROCESSING + path);
            InputStream is = new FileInputStream(path);
            XSSFWorkbook xssfWorkbook = new XSSFWorkbook(is);
            Student student = null;
            List<Student> list = new ArrayList<Student>();
            // Read the Sheet
            for (int numSheet = 0; numSheet < xssfWorkbook.getNumberOfSheets(); numSheet++) {
                XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(numSheet);
                if (xssfSheet == null) {
                    continue;
                }
                // Read the Row
                for (int rowNum = 1; rowNum <= xssfSheet.getLastRowNum(); rowNum++) {
                    XSSFRow xssfRow = xssfSheet.getRow(rowNum);
                    if (xssfRow != null) {
                        student = new Student();
                        XSSFCell no = xssfRow.getCell(0);
                        XSSFCell name = xssfRow.getCell(1);
                        XSSFCell age = xssfRow.getCell(2);
                        XSSFCell score = xssfRow.getCell(3);
                        student.setNo(getValue(no));
                        student.setName(getValue(name));
                        student.setAge(getValue(age));
                        student.setScore(Float.valueOf(getValue(score)));
                        list.add(student);
                    }
                }
            }
            return list;
        }
    
        /**
         * Read the Excel 2003-2007
         * @param path the path of the Excel
         * @return
         * @throws IOException
         */
        public List<Student> readXls(String path) throws IOException {
            System.out.println(Common.PROCESSING + path);
            InputStream is = new FileInputStream(path);
            HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);
            Student student = null;
            List<Student> list = new ArrayList<Student>();
            // Read the Sheet
            for (int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {
                HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
                if (hssfSheet == null) {
                    continue;
                }
                // Read the Row
                for (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
                    HSSFRow hssfRow = hssfSheet.getRow(rowNum);
                    if (hssfRow != null) {
                        student = new Student();
                        HSSFCell no = hssfRow.getCell(0);
                        HSSFCell name = hssfRow.getCell(1);
                        HSSFCell age = hssfRow.getCell(2);
                        HSSFCell score = hssfRow.getCell(3);
                        student.setNo(getValue(no));
                        student.setName(getValue(name));
                        student.setAge(getValue(age));
                        student.setScore(Float.valueOf(getValue(score)));
                        list.add(student);
                    }
                }
            }
            return list;
        }
    
        @SuppressWarnings("static-access")
        private String getValue(XSSFCell xssfRow) {
            if (xssfRow.getCellType() == xssfRow.CELL_TYPE_BOOLEAN) {
                return String.valueOf(xssfRow.getBooleanCellValue());
            } else if (xssfRow.getCellType() == xssfRow.CELL_TYPE_NUMERIC) {
                return String.valueOf(xssfRow.getNumericCellValue());
            } else {
                return String.valueOf(xssfRow.getStringCellValue());
            }
        }
    
        @SuppressWarnings("static-access")
        private String getValue(HSSFCell hssfCell) {
            if (hssfCell.getCellType() == hssfCell.CELL_TYPE_BOOLEAN) {
                return String.valueOf(hssfCell.getBooleanCellValue());
            } else if (hssfCell.getCellType() == hssfCell.CELL_TYPE_NUMERIC) {
                return String.valueOf(hssfCell.getNumericCellValue());
            } else {
                return String.valueOf(hssfCell.getStringCellValue());
            }
        }
    }

    /Excel2010/src/com/b510/excel/client/Client.java

    /**
     * 
     */
    package com.b510.excel.client;
    
    import java.io.IOException;
    import java.util.List;
    
    import com.b510.common.Common;
    import com.b510.excel.ReadExcel;
    import com.b510.excel.vo.Student;
    
    /**
     * @author Hongten
     * @created 2014-5-21
     */
    public class Client {
    
        public static void main(String[] args) throws IOException {
            String excel2003_2007 = Common.STUDENT_INFO_XLS_PATH;
            String excel2010 = Common.STUDENT_INFO_XLSX_PATH;
            // read the 2003-2007 excel
            List<Student> list = new ReadExcel().readExcel(excel2003_2007);
            if (list != null) {
                for (Student student : list) {
                    System.out.println("No. : " + student.getNo() + ", name : " + student.getName() + ", age : " + student.getAge() + ", score : " + student.getScore());
                }
            }
            System.out.println("======================================");
            // read the 2010 excel
            List<Student> list1 = new ReadExcel().readExcel(excel2010);
            if (list1 != null) {
                for (Student student : list1) {
                    System.out.println("No. : " + student.getNo() + ", name : " + student.getName() + ", age : " + student.getAge() + ", score : " + student.getScore());
                }
            }
        }
    }

    /Excel2010/src/com/b510/excel/util/Util.java

    /**
     * 
     */
    package com.b510.excel.util;
    
    import com.b510.common.Common;
    
    /**
     * @author Hongten
     * @created 2014-5-21
     */
    public class Util {
    
        /**
         * get postfix of the path
         * @param path
         * @return
         */
        public static String getPostfix(String path) {
            if (path == null || Common.EMPTY.equals(path.trim())) {
                return Common.EMPTY;
            }
            if (path.contains(Common.POINT)) {
                return path.substring(path.lastIndexOf(Common.POINT) + 1, path.length());
            }
            return Common.EMPTY;
        }
    }

    /Excel2010/src/com/b510/excel/vo/Student.java

    /**
     * 
     */
    package com.b510.excel.vo;
    
    /**
     * Student
     * 
     * @author Hongten
     * @created 2014-5-18
     */
    public class Student {
        /**
         * id   
         */
        private Integer id;
        /**
         * 学号
         */
        private String no;
        /**
         * 姓名
         */
        private String name;
        /**
         * 学院
         */
        private String age;
        /**
         * 成绩
         */
        private float score;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getNo() {
            return no;
        }
    
        public void setNo(String no) {
            this.no = no;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getAge() {
            return age;
        }
    
        public void setAge(String age) {
            this.age = age;
        }
    
        public float getScore() {
            return score;
        }
    
        public void setScore(float score) {
            this.score = score;
        }
    
    }
    展开全文
  • 使用Java的POI工具进行Word的DOC文档转为HTML页面技术简介
    使用Java的POI工具进行Word的DOC文档转为HTML页面技术简介
    1.     下载POI工具并引用。

    2.     读取整个doc文档,获得该文档的所有字符串。

    3.     从该字符串中得到标题,把该标题构成一个HTML格式的字符串,如<html><head><title>测试文档</title></head><body>。

    4.     从该文档中判断是否有表格,如有,把每个表格的开始偏移量,结束偏移量记录下来,同时根据每个表格的行,列读取表格的内容,并构造出表格的HTML字符串。

    5.     从该字符串的第一个字符开始逐个字符循环,得到字符的字体,字号大小,直到下一个字符的字体,字号不一样时,把这些字符内容构造成一个HTML格式的字符串。

    6.     如果碰到字符为回车符,制表符,把回车符,制表符构造成HTML格式的字符串。

    7.     如果碰到字符为图片,读取图片,把图片放在指定路径,再把这一路径的信息构造成HTML字符串,如<img src='c://test//1.jpg'/>。

    8.     如读取字符串的位置等于表格的开始偏移量时,插入前面一构造出的表格HTML字符串,同时跳过表格的结束偏移量,继续往下循环读取字符。

    9.     由于以上读取是按字符串逐个读取,并且根据字符的变化同时构造出HTML字符串,所以当字符串读取完毕后,即构造出一个完整的HTML字符串。、

    10.    举例源代码:

    /**
     *  POI读取word转换html
     *  引用自http://z276356445t.iteye.com/blog/963950
     */
    package com.util;
    
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.OutputStreamWriter;
    
    import org.apache.poi.hwpf.HWPFDocument;
    import org.apache.poi.hwpf.model.PicturesTable;
    import org.apache.poi.hwpf.usermodel.CharacterRun;
    import org.apache.poi.hwpf.usermodel.Picture;
    import org.apache.poi.hwpf.usermodel.Range;
    
    /**
     * 
     * @author 张廷 下午10:36:40
     * 
     */
    public class WordToHtml {
    
    	/**
    	 * 回车符ASCII码
    	 */
    	private static final short ENTER_ASCII = 13;
    
    	/**
    	 * 空格符ASCII码
    	 */
    	private static final short SPACE_ASCII = 32;
    
    	/**
    	 * 水平制表符ASCII码
    	 */
    	private static final short TABULATION_ASCII = 9;
    
    	private String htmlText = "";
    
    	/**
    	 * 读取每个文字样式
    	 * 
    	 * @param fileName
    	 * @throws Exception
    	 */
    	public void getWordAndStyle(String fileName) throws Exception {
    
    		FileInputStream in = new FileInputStream(new File(fileName));
    
    		HWPFDocument doc = new HWPFDocument(in);
    
    		// 取得文档中字符的总数
    		int length = doc.characterLength();
    
    		// 创建图片容器
    		PicturesTable pTable = doc.getPicturesTable();
    
    		htmlText = "<html><head><title>" + doc.getSummaryInformation().getTitle() + "</title></head><body>";
    
    		// 创建临时字符串,好加以判断一串字符是否存在相同格式
    
    		String tempString = "";
    
    		for (int i = 0; i < length - 1; i++) {
    			// 整篇文章的字符通过一个个字符的来判断,range为得到文档的范围
    			Range range = new Range(i, i + 1, doc);
    
    			CharacterRun cr = range.getCharacterRun(0);
    
    			if (pTable.hasPicture(cr)) {
    
    				// 读写图片
    				this.readPicture(pTable, cr);
    
    			} else {
    
    				Range range2 = new Range(i + 1, i + 2, doc);
    
    				// 第二个字符
    				CharacterRun cr2 = range2.getCharacterRun(0);
    
    				// 当前字符
    				char currentChar = cr.text().charAt(0);
    
    				// 判断是否为回车符
    				if (currentChar == ENTER_ASCII)
    					tempString += "<br/>";
    				// 判断是否为空格符
    				else if (currentChar == SPACE_ASCII)
    					tempString += " ";
    				// 判断是否为水平制表符
    				else if (currentChar == TABULATION_ASCII)
    					tempString += "    ";
    				// 比较前后2个字符是否具有相同的格式
    				boolean flag = compareCharStyle(cr, cr2);
    
    				String fontStyle = "<span style='font-family:" + cr.getFontName() + ";font-size:" + cr.getFontSize() / 2 + "pt;";
    
    				if (cr.isBold())
    					fontStyle += "font-weight:bold;";
    				if (cr.isItalic())
    					fontStyle += "font-style:italic;";
    
    				if (flag && i != length - 2)
    					tempString += currentChar;
    				else if (!flag) {
    					htmlText += fontStyle + "'>" + tempString + currentChar + "</span>";
    					tempString = "";
    				} else
    					htmlText += fontStyle + "'>" + tempString + currentChar + "</span>";
    			}
    		htmlText += "</body></html>";
    
    		this.writeFile(htmlText);
    	}
    
    	/**
    	 * 读写文档中的图片
    	 * 
    	 * @param pTable
    	 * @param cr
    	 * @throws Exception
    	 */
    	private void readPicture(PicturesTable pTable, CharacterRun cr) throws Exception {
    		// 提取图片
    		Picture pic = pTable.extractPicture(cr, false);
    
    		// 返回POI建议的图片文件名
    		String afileName = pic.suggestFullFileName();
    
    		OutputStream out = new FileOutputStream(new File("g:\\test" + File.separator + afileName));
    
    		pic.writeImageContent(out);
    
    		htmlText += "<img src='g:\\test\\" + afileName + "'/>";
    	}
    
    	private boolean compareCharStyle(CharacterRun cr1, CharacterRun cr2) {
    		boolean flag = false;
    		if (cr1.isBold() == cr2.isBold() && cr1.isItalic() == cr2.isItalic() && cr1.getFontName().equals(cr2.getFontName()) && cr1.getFontSize() == cr2.getFontSize()) {
    			flag = true;
    		}
    		return flag;
    	}
    
    	/**
    	 * 写文件
    	 * 
    	 * @param s
    	 */
    	private void writeFile(String s) {
    		FileOutputStream fos = null;
    		BufferedWriter bw = null;
    		try {
    			File file = new File("g:\\abc.html");
    			fos = new FileOutputStream(file);
    			bw = new BufferedWriter(new OutputStreamWriter(fos));
    			bw.write(s);
    		} catch (FileNotFoundException fnfe) {
    			fnfe.printStackTrace();
    		} catch (IOException ioe) {
    			ioe.printStackTrace();
    		} finally {
    			try {
    				if (bw != null)
    					bw.close();
    				if (fos != null)
    					fos.close();
    			} catch (IOException ie) {
    			}
    		}
    	}
    }


    展开全文
  • 4gl可以调用java的poi包实现EXCEL的导入导出,今天分享一个EXCEL导入的功能! 一:环境搭建 1:poi文件导入 首先下载POI文件(找不到的可以私信我),解压后上传到ERP的服务器中 一般位置放在$TOP/ds4gl2/bin/javaad...
  • java的poi导入Excel文件

    千次阅读 2018-12-05 15:27:06
    poi/upload.do" method="post" enctype="multipart/form-data"&gt; 选择文件:&lt;input type="file" name="productFile"&gt; &lt;input type=&...
  • JAVA通过poi进行Excel文档读取操作
  • java的poi技术读取Excel

    千次阅读 2017-07-12 11:42:58
    原文 项目中所需要jar文件: ...所用Excel数据(2003-2007,2010都是一样数据) ...—————————————这个是我简化demo(.xlsx部分注释了)——————————...import java.io.FileInputStream;
  • 下面是我代码效果,可是没有下载效果,值得注意是我workbook对象是通过 存储在对象里面。传递到controller层,不知道有没有影响 ![图片说明]...
  • java的poi技术读写excel数据

    千次阅读 2016-04-05 21:34:56
    Apache POI 是创建和维护操作各种符合Office Open XML(OOXML)标准和微软OLE 2复合文档格式(OLE2)的Java API。用它可以使用Java读取和创建,修改MS Excel文件.而且,还可以使用Java读取和创建MSWord和...
  • SpringBoot中使用POI实现Excel导入到数据库(图文教程已实践): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/88660466 需求 在进行导入时,在导入数据库之前需要进行时间格式验证,确保不会乱...
  • SpringBoot中使用POI实现Excel导入到数据库(图文教程已实践): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/88660466 需求 在进行导入时,在导入数据库之前需要进行整型格式验证,确保不会乱...
  • https://jingyan.baidu.com/article/456c463b3629620a583144fb.html
  • java的poi类读取一个excel表格的内容后再写入到一个新excel表格中的完整代码 举报| 分享| 2013-10-20 11:12香蕉核里的虫 | 浏览 1862 次 是一个c/s程序 在本地读取后再保存到本地 excel数据量大 ...
  • Java的poi技术读取和导入Excel

    千次阅读 2014-07-09 10:43:36
    报表输出是Java应用开发...因此,本文探讨一下POI视线Java程序进行Excel读取和导入。 AD:WOT2014:用户标签系统与用户数据化运营培训专场 项目结构: 用到Excel文件: XlsMain .
  • 报表输出是Java应用开发中经常...因此,本文探讨一下POI视线Java程序进行Excel读取和导入。 AD: 项目结构: 用到Excel文件: XlsMain .java 类 //该类有main方法,主要负责
  • https://www.yuque.com/easyexcel/doc/easyexcel 阿里开源组件,牛到不行!!!!!
  • java的poi技术读取Excel数据到MySQL

    千次阅读 2017-08-29 22:14:36
    Excel中测试数据: 数据库结构: 对应SQL: 1 CREATE TABLE `student_info` ( 2 `id` int(11) NOT NULL AUTO_INCREMENT, 3 `no` varchar(20) DEFAULT NULL, 4 `name` varchar(20) DEFAULT
  • 比如用户发过来一个doc文档,但是我... 那我用poi处理时应该怎么做?可以识别吗? 我查了一下文档没有找到这部分。。。大多网上例子都是知道上传是wps还是word。 我试了下发现不进行分类处理好像会有乱码。。。
  • if(temp.get(0).getClass().getName().equals("org.apache.poi.hssf.usermodel.HSSFCell")){ return error_num; }else{ TStudentNo student = null; List<TStudentNo> studentList = newArrayList(); for(int i=0;i...
  • JAVA POI的使用

    万次阅读 多人点赞 2018-02-01 11:44:48
    下载地址 https://archive.apache.org/dist/poi/release/bin/ ...Poi-3.10-Final.jar (用于xls)Poi-ooxml-3.10-Final.jar (用于xlsx)Poi-ooxml-schemas-3.10.jarXmlbeans-2.30.jardom4j-1.6.1.jarp
  • 问题:java的poi导出excel怎么设置单元格不可编辑 少说话,直接上代码。//单元格锁定的样式 XSSFCellStyle lockstyle = (XSSFCellStyle) wb.createCellStyle(); lockstyle.setLocked(true); lockstyle....
  • JAVA使用POI读取EXCEL文件简单model

    万次阅读 2017-05-23 14:42:03
    [java] view plain copy print?packagepoi;importjava.io.FileInputStream;importjava.io.IOException;importjava.io.InputStream;importjava.util.Iterator;importorg.apache.poi.hssf.usermodel.HS
  • Java-POI使用

    2020-02-18 10:49:43
    文章目录Java-POI使用一、前言二、记录1.依赖包选择2.Excel读取3.Word读取4...Apache POI-Microsoft文档的Java API 环境说明: JDK:1.8 POI: 4.11 参考: 环境说明:https://poi.apache.org/devel/index.html ...
  • java使用poi操作excel需要所有jar包(poi3.8版本),里面有poi-3.8-20120326.jar、poi-ooxml-3.8-20120326.jar、poi-ooxml-schemas-3.8-20120326.jar、dom4j-1.6.1.jar、xmlbeans-2.3.0.jar
  • 在我们使用JAVA开发过程中,经常要导出查询获得的数据,这些数据一般情况下都是以Excel存储的,因此我们在导出数据的时候要使用JAVA的POI库,其主要是对各种windows平台的数据格式进行操作,在这里,我们是对Excel...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,428
精华内容 6,171
关键字:

java的poi

java 订阅