`

Java操作Excel文件导入

    博客分类:
  • java
阅读更多

 

用Excel作为数据源,通过Java Web进行导入,需要POI的jar。
apachepoi(org.apache.poi 3.8) 可以支持公式、日期等格式!
不说废话,上代码:
Java代码 复制代码 收藏代码
  1. /**  
  2.  * Jun 25, 2012  
  3.  */  
  4.   
  5. import java.io.File;   
  6. import java.io.FileInputStream;   
  7. import java.io.IOException;   
  8. import java.io.InputStream;   
  9. import java.util.ArrayList;   
  10. import java.util.List;   
  11.   
  12. import org.apache.commons.io.FilenameUtils;   
  13. import org.apache.poi.hssf.usermodel.HSSFWorkbook;   
  14. import org.apache.poi.ss.usermodel.Cell;   
  15. import org.apache.poi.ss.usermodel.CellValue;   
  16. import org.apache.poi.ss.usermodel.FormulaEvaluator;   
  17. import org.apache.poi.ss.usermodel.Row;   
  18. import org.apache.poi.ss.usermodel.Sheet;   
  19. import org.apache.poi.ss.usermodel.Workbook;   
  20. import org.apache.poi.xssf.usermodel.XSSFWorkbook;   
  21.   
  22. /**  
  23.  * Excel组件  
  24.  *   
  25.  * @author Snowolf  
  26.  * @version 1.0  
  27.  * @since 1.0  
  28.  */  
  29. public abstract class ExcelHelper {   
  30.   
  31.     /**  
  32.      * Excel 2003  
  33.      */  
  34.     private final static String XLS = "xls";   
  35.     /**  
  36.      * Excel 2007  
  37.      */  
  38.     private final static String XLSX = "xlsx";   
  39.     /**  
  40.      * 分隔符  
  41.      */  
  42.     private final static String SEPARATOR = "|";   
  43.   
  44.     /**  
  45.      * 由Excel文件的Sheet导出至List  
  46.      *   
  47.      * @param file  
  48.      * @param sheetNum  
  49.      * @return  
  50.      */  
  51.     public static List<String> exportListFromExcel(File file, int sheetNum)   
  52.             throws IOException {   
  53.         return exportListFromExcel(new FileInputStream(file),   
  54.                 FilenameUtils.getExtension(file.getName()), sheetNum);   
  55.     }   
  56.   
  57.     /**  
  58.      * 由Excel流的Sheet导出至List  
  59.      *   
  60.      * @param is  
  61.      * @param extensionName  
  62.      * @param sheetNum  
  63.      * @return  
  64.      * @throws IOException  
  65.      */  
  66.     public static List<String> exportListFromExcel(InputStream is,   
  67.             String extensionName, int sheetNum) throws IOException {   
  68.   
  69.         Workbook workbook = null;   
  70.   
  71.         if (extensionName.toLowerCase().equals(XLS)) {   
  72.             workbook = new HSSFWorkbook(is);   
  73.         } else if (extensionName.toLowerCase().equals(XLSX)) {   
  74.             workbook = new XSSFWorkbook(is);   
  75.         }   
  76.   
  77.         return exportListFromExcel(workbook, sheetNum);   
  78.     }   
  79.   
  80.     /**  
  81.      * 由指定的Sheet导出至List  
  82.      *   
  83.      * @param workbook  
  84.      * @param sheetNum  
  85.      * @return  
  86.      * @throws IOException  
  87.      */  
  88.     private static List<String> exportListFromExcel(Workbook workbook,   
  89.             int sheetNum) {   
  90.   
  91.         Sheet sheet = workbook.getSheetAt(sheetNum);   
  92.   
  93.         // 解析公式结果   
  94.         FormulaEvaluator evaluator = workbook.getCreationHelper()   
  95.                 .createFormulaEvaluator();   
  96.   
  97.         List<String> list = new ArrayList<String>();   
  98.   
  99.         int minRowIx = sheet.getFirstRowNum();   
  100.         int maxRowIx = sheet.getLastRowNum();   
  101.         for (int rowIx = minRowIx; rowIx < maxRowIx; rowIx++) {   
  102.             Row row = sheet.getRow(rowIx);   
  103.             StringBuilder sb = new StringBuilder();   
  104.   
  105.             short minColIx = row.getFirstCellNum();   
  106.             short maxColIx = row.getLastCellNum();   
  107.             for (short colIx = minColIx; colIx < maxColIx; colIx++) {   
  108.                 Cell cell = row.getCell(new Integer(colIx));   
  109.                 CellValue cellValue = evaluator.evaluate(cell);   
  110.                 if (cellValue == null) {   
  111.                     continue;   
  112.                 }   
  113.                 // 经过公式解析,最后只存在Boolean、Numeric和String三种数据类型,此外就是Error了   
  114.                 // 其余数据类型,根据官方文档,完全可以忽略http://poi.apache.org/spreadsheet/eval.html   
  115.                 switch (cellValue.getCellType()) {   
  116.                 case Cell.CELL_TYPE_BOOLEAN:   
  117.                     sb.append(SEPARATOR + cellValue.getBooleanValue());   
  118.                     break;   
  119.                 case Cell.CELL_TYPE_NUMERIC:   
  120.                     // 这里的日期类型会被转换为数字类型,需要判别后区分处理   
  121.                     if (DateUtil.isCellDateFormatted(cell)) {   
  122.                         sb.append(SEPARATOR + cell.getDateCellValue());   
  123.                     } else {   
  124.                         sb.append(SEPARATOR + cellValue.getNumberValue());   
  125.                     }   
  126.                     break;   
  127.                 case Cell.CELL_TYPE_STRING:   
  128.                     sb.append(SEPARATOR + cellValue.getStringValue());   
  129.                     break;   
  130.                 case Cell.CELL_TYPE_FORMULA:   
  131.                     break;   
  132.                 case Cell.CELL_TYPE_BLANK:   
  133.                     break;   
  134.                 case Cell.CELL_TYPE_ERROR:   
  135.                     break;   
  136.                 default:   
  137.                     break;   
  138.                 }   
  139.             }   
  140.             list.add(sb.toString());   
  141.         }   
  142.         return list;   
  143.     }   
  144. }  
/**
 * Jun 25, 2012
 */

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.io.FilenameUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellValue;
import org.apache.poi.ss.usermodel.FormulaEvaluator;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**
 * Excel组件
 * 
 * @author Snowolf
 * @version 1.0
 * @since 1.0
 */
public abstract class ExcelHelper {

	/**
	 * Excel 2003
	 */
	private final static String XLS = "xls";
	/**
	 * Excel 2007
	 */
	private final static String XLSX = "xlsx";
	/**
	 * 分隔符
	 */
	private final static String SEPARATOR = "|";

	/**
	 * 由Excel文件的Sheet导出至List
	 * 
	 * @param file
	 * @param sheetNum
	 * @return
	 */
	public static List<String> exportListFromExcel(File file, int sheetNum)
			throws IOException {
		return exportListFromExcel(new FileInputStream(file),
				FilenameUtils.getExtension(file.getName()), sheetNum);
	}

	/**
	 * 由Excel流的Sheet导出至List
	 * 
	 * @param is
	 * @param extensionName
	 * @param sheetNum
	 * @return
	 * @throws IOException
	 */
	public static List<String> exportListFromExcel(InputStream is,
			String extensionName, int sheetNum) throws IOException {

		Workbook workbook = null;

		if (extensionName.toLowerCase().equals(XLS)) {
			workbook = new HSSFWorkbook(is);
		} else if (extensionName.toLowerCase().equals(XLSX)) {
			workbook = new XSSFWorkbook(is);
		}

		return exportListFromExcel(workbook, sheetNum);
	}

	/**
	 * 由指定的Sheet导出至List
	 * 
	 * @param workbook
	 * @param sheetNum
	 * @return
	 * @throws IOException
	 */
	private static List<String> exportListFromExcel(Workbook workbook,
			int sheetNum) {

		Sheet sheet = workbook.getSheetAt(sheetNum);

		// 解析公式结果
		FormulaEvaluator evaluator = workbook.getCreationHelper()
				.createFormulaEvaluator();

		List<String> list = new ArrayList<String>();

		int minRowIx = sheet.getFirstRowNum();
		int maxRowIx = sheet.getLastRowNum();
		for (int rowIx = minRowIx; rowIx < maxRowIx; rowIx++) {
			Row row = sheet.getRow(rowIx);
			StringBuilder sb = new StringBuilder();

			short minColIx = row.getFirstCellNum();
			short maxColIx = row.getLastCellNum();
			for (short colIx = minColIx; colIx < maxColIx; colIx++) {
				Cell cell = row.getCell(new Integer(colIx));
				CellValue cellValue = evaluator.evaluate(cell);
				if (cellValue == null) {
					continue;
				}
				// 经过公式解析,最后只存在Boolean、Numeric和String三种数据类型,此外就是Error了
				// 其余数据类型,根据官方文档,完全可以忽略http://poi.apache.org/spreadsheet/eval.html
				switch (cellValue.getCellType()) {
				case Cell.CELL_TYPE_BOOLEAN:
					sb.append(SEPARATOR + cellValue.getBooleanValue());
					break;
				case Cell.CELL_TYPE_NUMERIC:
					// 这里的日期类型会被转换为数字类型,需要判别后区分处理
					if (DateUtil.isCellDateFormatted(cell)) {
						sb.append(SEPARATOR + cell.getDateCellValue());
					} else {
						sb.append(SEPARATOR + cellValue.getNumberValue());
					}
					break;
				case Cell.CELL_TYPE_STRING:
					sb.append(SEPARATOR + cellValue.getStringValue());
					break;
				case Cell.CELL_TYPE_FORMULA:
					break;
				case Cell.CELL_TYPE_BLANK:
					break;
				case Cell.CELL_TYPE_ERROR:
					break;
				default:
					break;
				}
			}
			list.add(sb.toString());
		}
		return list;
	}
}


由于Excel中的数据有日期、公式等等格式,参考http://poi.apache.org/spreadsheet/eval.html做了修改,完全兼容。

当前的Excel,C列是根据A、B相乘计算而来,D列是日期格式:



测试下:
Java代码 复制代码 收藏代码
  1. /**  
  2.  * Jun 25, 2012  
  3.  */  
  4.   
  5. import java.io.File;   
  6. import java.io.IOException;   
  7. import java.util.List;   
  8.   
  9. import static org.junit.Assert.*;   
  10. import org.junit.Test;   
  11.   
  12. /**  
  13.  *   
  14.  * @author Snowolf  
  15.  * @version 1.0  
  16.  * @since 1.0  
  17.  */  
  18. public class ExcelHelperTest {   
  19.   
  20.     @Test  
  21.     public void test() {   
  22.         String path = "excel.xlsx";   
  23.         List<String> list = null;   
  24.         try {   
  25.             list = ExcelHelper.exportListFromExcel(new File(path), 0);   
  26.             assertNotNull(list);   
  27.         } catch (IOException e) {   
  28.             fail();   
  29.         }   
  30.   
  31.     }   
  32. }  
/**
 * Jun 25, 2012
 */

import java.io.File;
import java.io.IOException;
import java.util.List;

import static org.junit.Assert.*;
import org.junit.Test;

/**
 * 
 * @author Snowolf
 * @version 1.0
 * @since 1.0
 */
public class ExcelHelperTest {

	@Test
	public void test() {
		String path = "excel.xlsx";
		List<String> list = null;
		try {
			list = ExcelHelper.exportListFromExcel(new File(path), 0);
			assertNotNull(list);
		} catch (IOException e) {
			fail();
		}

	}
}

就是这样了


详见附件!
分享到:
评论

相关推荐

    java读取excel数据导入数据库源码

    java读取excel数据导入数据库源码 java读取excel数据导入数据库源码

    java代码实现Excel文件的导入和导出

    总结来说,Java通过Apache POI库提供了强大的Excel文件处理能力,能够方便地进行导入和导出操作。通过理解这些基本概念和实践,你可以构建起处理Excel文件的强大工具,无论是数据分析还是报表生成,都能游刃有余。

    java 导入Excel 文件,支持xls、xlsx、csv格式

    在Java编程中,导入Excel文件是一项常见的任务,特别是在数据处理和数据分析领域。为了支持不同版本的Excel文件以及CSV格式的数据,开发者需要了解并掌握相关的API和技术。以下将详细讲解如何在Java中处理`xls`、`...

    java Swing 导入导出Excel文件

    自定义的一个excel文件导入导出类,支持Excel2003到2010的格式。里面也有简单的配置文件的创建。

    利用JAVA操作EXCEL文件.pdf

    ### 利用JAVA操作EXCEL文件的关键知识点 #### 一、JAVA EXCEL API 简介 - **项目背景**:随着Web应用的发展,越来越多的应用场景需要通过Web端操作Excel文件,而传统的CSV文件虽然可以被Excel打开,但无法实现对...

    java xml excel文件导入导出

    反之,也可以先将XML解析为Java对象,再写入到Excel文件。 2. **转换工具**:ExcelXmlParse可能是实现这种转换的工具类或框架,它封装了读写Excel和XML的逻辑,提供便捷的接口供开发者调用。 3. **性能优化**:在...

    java解析Excel文件并把数据存入数据库和导出数据为excel文件SpringBoot代码示例

    1、java解析读取excel文件中的数据,并写入数据库。 2、java读取数据库数据,并导出为excel文件。 3、README.md中有详细的操作步骤示例。 使用说明: 1. 先使用postman导入:other/excel相关.postman_collection....

    java实现Excel数据导入到mysql数据库.zip

    首先,Java的文件操作是基础,我们需要读取Excel文件。在Java中,可以使用Apache POI库来处理Microsoft Office格式的文件,如Excel。POI库提供了API,使得我们可以方便地读取、写入和修改Excel文件。例如,通过...

    java实现excel导入数据库

    要完成这个过程,我们需要使用特定的库来读取Excel文件,并使用JDBC(Java Database Connectivity)来与MySQL数据库进行交互。下面将详细解释如何实现这个功能。 首先,我们需要引入两个关键的第三方库:Apache POI...

    java实现Excel数据导入到数据库

    5. **关闭资源**:操作完成后,记得关闭数据库连接和Excel文件输入流,释放系统资源。 接着,我们来看数据库数据导出到Excel的过程: 1. **查询数据库**:使用JDBC的`Statement`或`PreparedStatement`执行SQL查询...

    JAVA中excel导入导出通用方法

    在 Java 项目中想要实现 excel 文件的导入和导出功能,需要引入 jxl 库,该库提供了对 excel 文件的读写操作。 二、创建工作簿 首先,需要创建一个工作簿对象,用于存储 excel 文件的数据。可以使用 `...

    java操作Excel文件

    在Java编程环境中,操作Excel文件是一项常见的任务,尤其在数据处理、数据分析或自动化测试等领域。本文将深入探讨如何使用Java来读取、写入和修改Excel文件,主要涉及的库有Apache POI和JExcelApi。 Apache POI是...

    java poi操作excel批量导入导出项目需要的jar包

    它允许开发者在Java应用程序中创建、修改和读取Excel文件。在进行批量导入和导出Excel数据时,Apache POI是一个非常实用的选择。以下是关于使用Java POI进行Excel操作的关键知识点: 1. **Apache POI介绍**: ...

    Java 使用poi导入excel 并使用xml做数据验证

    导入数据的过程中,首先需要创建一个`Workbook`对象来代表Excel文件,然后通过`Sheet`对象来操作单个工作表,接着是`Row`和`Cell`对象来处理每一行和每一列的数据。使用POI读取Excel数据的基本步骤如下: 1. 加载...

    Java解析Excel与导入Excel

    在Java编程领域,处理Excel文件是一项常见的任务,特别是在数据导入导出、报表生成以及数据分析等场景。本篇文章将深入探讨如何使用开源库easypoi来实现Java中的Excel操作,包括Excel的导出和导入功能。 easypoi是...

    java_poi实现excel导入导出

    Java POI 实现 Excel 导入导出 Java POI 是一个流行的 Java 库,用于处理 Microsoft Office 文件格式,包括 ...在本文中,我们已经详细介绍了如何使用 Java POI 实现 Excel 导入导出功能,包括读取和写入 Excel 文件。

    Java实现Excel导入导出

    Excel源代码,导入导出各种工具类 &lt;groupId&gt;org.apache.poi &lt;artifactId&gt;poi &lt;groupId&gt;org.apache.poi &lt;artifactId&gt;poi-scratchpad 代码实例: String path = ""; byte[] bytes; vo.setCurrentPage(0); vo....

    java读取excel文件

    2. Excel 文件操作:Excel 文件操作是指使用 Java 语言对 Excel 文件进行读取、写入、删除等操作的过程。 3. JXL 库:JXL 库是指 Java Excel API,即 Java 语言对 Excel 文件的操作 API。 4. Workbook:Workbook 是...

    Java导入excel文件

    在Java中,使用Apache POI可以方便地操作Excel文件,如创建、修改、读取和写入数据。 2. **工作簿(Workbook)和工作表(Sheet)**:在Apache POI中,`Workbook`代表一个Excel文件,而`Sheet`则表示工作簿中的一页...

Global site tag (gtag.js) - Google Analytics