使用POI来实现对Excel的读写操作

事实上我感觉直接贴代码就好了。代码里面差点儿做到每一行一个凝视。应该看起来会比較简单

代码托管在github上:https://github.com/chsj1/ExcelUtils

package com.hjd.poiutils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import org.apache.poi.ss.usermodel.Sheet;

import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ExcelUtils {

	public static final String HEADERINFO = "headInfo";
	public static final String DATAINFON = "dataInfo";

	/**
	 *
	 * @Title: getWeebWork
	 * @Description: TODO(依据传入的文件名称获取工作簿对象(Workbook))
	 * @param filename
	 * @return
	 * @throws IOException
	 */
	public static Workbook getWeebWork(String filename) throws IOException {
		Workbook workbook = null;
		if (null != filename) {
			String fileType = filename.substring(filename.lastIndexOf("."),
					filename.length());
			FileInputStream fileStream = new FileInputStream(new File(filename));
			if (".xls".equals(fileType.trim().toLowerCase())) {
				workbook = new HSSFWorkbook(fileStream);// 创建 Excel 2003 工作簿对象
			} else if (".xlsx".equals(fileType.trim().toLowerCase())) {
				workbook = new XSSFWorkbook(fileStream);// 创建 Excel 2007 工作簿对象
			}
		}
		return workbook;
	}

	/**
	 *
	 * @Title: writeExcel
	 * @Description: TODO(导出Excel表)
	 * @param pathname
	 *            :导出Excel表的文件路径
	 * @param map
	 *            :封装须要导出的数据(HEADERINFO封装表头信息。DATAINFON:封装要导出的数据信息,此处须要使用TreeMap
	 *            ) 比如: map.put(ExcelUtil.HEADERINFO,List<String> headList);
	 *            map.put(ExcelUtil.DATAINFON,List<TreeMap<String,Object>>
	 *            dataList);
	 * @param wb
	 * @throws IOException
	 */
	public static void writeExcel(String pathname, Map<String, Object> map,
			Workbook wb) throws IOException {
		if (null != map && null != pathname) {
			List<Object> headList = (List<Object>) map
					.get(ExcelUtils.HEADERINFO);
			List<TreeMap<String, Object>> dataList = (List<TreeMap<String, Object>>) map
					.get(ExcelUtils.DATAINFON);
			CellStyle style = getCellStyle(wb);
			Sheet sheet = wb.createSheet();// 在文档对象中创建一个表单..默认是表单名字是Sheet0、Sheet1....
			// Sheet sheet = wb.createSheet("hell poi");//在创建爱你表单的时候指定表单的名字

			/**
			 * 设置Excel表的第一行即表头
			 */
			Row row = sheet.createRow(0);
			for (int i = 0; i < headList.size(); i++) {
				Cell headCell = row.createCell(i);
				headCell.setCellType(Cell.CELL_TYPE_STRING);// 设置这个单元格的数据的类型,是文本类型还是数字类型
				headCell.setCellStyle(style);// 设置表头样式
				headCell.setCellValue(String.valueOf(headList.get(i)));// 给这个单元格设置值
			}

			for (int i = 0; i < dataList.size(); i++) {
				Row rowdata = sheet.createRow(i + 1);// 创建数据行
				TreeMap<String, Object> mapdata = dataList.get(i);
				Iterator it = mapdata.keySet().iterator();
				int j = 0;
				while (it.hasNext()) {
					String strdata = String.valueOf(mapdata.get(it.next()));
					Cell celldata = rowdata.createCell(j);// 在一行中创建某列..
					celldata.setCellType(Cell.CELL_TYPE_STRING);
					celldata.setCellValue(strdata);
					j++;
				}
			}

			// 文件流
			File file = new File(pathname);
			OutputStream os = new FileOutputStream(file);
			os.flush();
			wb.write(os);
			os.close();
		}
	}

	/**
	 *
	 * @Title: getCellStyle
	 * @Description: TODO(设置表头样式)
	 * @param wb
	 * @return
	 */
	public static CellStyle getCellStyle(Workbook wb) {
		CellStyle style = wb.createCellStyle();
		Font font = wb.createFont();
		font.setFontName("宋体");
		font.setFontHeightInPoints((short) 12);// 设置字体大小
		font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 加粗
		style.setFillForegroundColor(HSSFColor.LIME.index);// 设置背景色
		style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
		style.setAlignment(HSSFCellStyle.SOLID_FOREGROUND);// 让单元格居中
		// style.setWrapText(true);//设置自己主动换行
		style.setFont(font);
		return style;
	}

	/**
	 *
	 * @Title: readerExcelDemo
	 * @Description: TODO(读取Excel表中的数据)
	 * @throws IOException
	 */
	public static void readFromExcelDemo() throws IOException {
		/**
		 * 读取Excel表中的全部数据
		 */
		Workbook workbook = getWeebWork("E:/test.xlsx");
		System.out.println("总表页数为:" + workbook.getNumberOfSheets());// 获取表页数
		Sheet sheet = workbook.getSheetAt(0);
		// Sheet sheet = workbook.getSheetAt(1);
		int rownum = sheet.getLastRowNum();// 获取总行数
		for (int i = 0; i <= rownum; i++) {
			Row row = sheet.getRow(i);
			Cell orderno = row.getCell(2);// 获取指定单元格中的数据
			// System.out.println(orderno.getCellType());//这个打印的是cell的type
			short cellnum = row.getLastCellNum(); // 获取单元格的总列数
			for (int j = row.getFirstCellNum(); j < row.getLastCellNum(); j++) {
				Cell celldata = row.getCell(j);
				System.out.print(celldata + "\t");
			}
			System.out.println();
		}

		/**
		 * 读取指定位置的单元格
		 */
		// Row row1 = sheet.getRow(1);
		// Cell cell1 = row1.getCell(2);
		// System.out.print("(1,2)位置单元格的值为:"+cell1);
		// BigDecimal big = new
		// BigDecimal(cell1.getNumericCellValue());//将科学计数法表示的数据转化为String类型
		// System.out.print("\t"+String.valueOf(big));

	}

	public static void readFromExcelDemo1() throws IOException {
		/**
		 * 读取Excel表中的全部数据
		 *
		 * Workbook: excel的文档对象 sheet: excel的表单 row: excel中的行 cell: excel中的单元格子
		 *
		 */
		Workbook workbook = getWeebWork("E:/test.xlsx");
		System.out.println("总表页数为:" + workbook.getNumberOfSheets());// 获取表页数
		// Sheet sheet =workbook.getSheetAt(0);
		Sheet sheet = workbook.getSheetAt(2);// 获取第二个表单
		int rownum = sheet.getLastRowNum();// 获取总行数
		for (int i = 0; i <= rownum; i++) {
			Row row = sheet.getRow(i);// 获取表达的第i行
			// Cell orderno =
			// row.getCell(2);//获取指定单元格中的数据(获取一行中的第2列(这里的2指的是0,1,2.排在第三位))
			// System.out.println(orderno.getCellType());//这个打印的是cell的type
			// short cellnum=row.getLastCellNum();
			// //获取单元格的总列数(获取一行中有多少个单元格(也就是多少列))

			/**
			 * row.getFirstCellNum(): 获取行的第一个单元格的位置 row.getLastCellNum():
			 * 获取行的最后一个单元格的位置
			 */
			for (int j = row.getFirstCellNum(); j < row.getLastCellNum(); j++) {// 遍历一行中的全部列
				Cell celldata = row.getCell(j);// 获取一行中的第j列返回Cell类型的数据
				System.out.print(celldata + "\t");//
			}

			// 打印指定列
			// Cell celldata = row.getCell(4);//获取这一行中的第4列(在第5个位置上)
			// System.out.print( "\"" + celldata+"\",");

			System.out.println();
		}

		/**
		 * 读取指定位置的单元格
		 */
		// Row row1 = sheet.getRow(1);
		// Cell cell1 = row1.getCell(2);
		// System.out.print("(1,2)位置单元格的值为:"+cell1);
		// BigDecimal big = new
		// BigDecimal(cell1.getNumericCellValue());//将科学计数法表示的数据转化为String类型
		// System.out.print("\t"+String.valueOf(big));

	}

	public static void readFromExcelDemo(String fileAbsolutePath) throws IOException {
		/**
		 * 读取Excel表中的全部数据
		 */
		Workbook workbook = getWeebWork(fileAbsolutePath);
		System.out.println("总表页数为:" + workbook.getNumberOfSheets());// 获取表页数
		Sheet sheet = workbook.getSheetAt(0);
		// Sheet sheet = workbook.getSheetAt(1);
		int rownum = sheet.getLastRowNum();// 获取总行数
		for (int i = 0; i <= rownum; i++) {
			Row row = sheet.getRow(i);
			Cell orderno = row.getCell(2);// 获取指定单元格中的数据
			// System.out.println(orderno.getCellType());//这个打印的是cell的type
			short cellnum = row.getLastCellNum(); // 获取单元格的总列数
			for (int j = row.getFirstCellNum(); j < row.getLastCellNum(); j++) {
				Cell celldata = row.getCell(j);
				System.out.print(celldata + "\t");
			}
			System.out.println();
		}

		/**
		 * 读取指定位置的单元格
		 */
		// Row row1 = sheet.getRow(1);
		// Cell cell1 = row1.getCell(2);
		// System.out.print("(1,2)位置单元格的值为:"+cell1);
		// BigDecimal big = new
		// BigDecimal(cell1.getNumericCellValue());//将科学计数法表示的数据转化为String类型
		// System.out.print("\t"+String.valueOf(big));

	}

	public static void main(String[] args) throws IOException {
//		 readFromExcelDemo1();

//		String filePath = "E:/test.xlsx";
//		readFromExcelDemo(filePath);//从一个指定的excel文件里读取内容

//		writeToExcelDemo();
	}

	public static void writeToExcelDemo() throws IOException {
		/**
		 * HSSF: .xls XSSF: .xlsx 所以大家会在官网中看到Excel = HSSF+XSSF
		 *
		 * HSSF是POIproject对Excel 97(-2007)文件操作的纯Java实现 XSSF是POIproject对Excel 2007 OOXML
		 * (.xlsx)文件操作的纯Java实现
		 *
		 * 从POI 3.8版本号開始,提供了一种基于XSSF的低内存占用的API----SXSSF
		 *
		 */

		Workbook wb = new XSSFWorkbook();// 创建一个新的excel的文档对象
		Map<String, Object> map = new HashMap<String, Object>();
		List headList = new ArrayList();// 表头数据
		headList.add("下单时间");
		headList.add("结账时间");
		headList.add("订单编号");
		headList.add("订单金额");
		headList.add("username");// excel的都

		/**
		 * TreeMap基于红黑树实现
		 */
		List dataList = new ArrayList();// 表格内的数据
		for (int i = 0; i < 15; i++) {
			TreeMap<String, Object> treeMap = new TreeMap<String, Object>();// 此处的数据必须为有序数据,所以使用TreeMap进行封装
			treeMap.put("m1", "2013-10-" + i + 1);
			treeMap.put("m2", "2013-11-" + i + 1);
			treeMap.put("m3", "20124" + i + 1);
			treeMap.put("m4", 23.5 + i + 1);
			treeMap.put("m5", "张三_" + i);
			dataList.add(treeMap);
		}

		/*
		 * 先不要加上下面这一段,否则下面错误: Cannot get a numeric value from a text
		 * cell(不能从一个text cell中获取数字类型的数据)
		 *
		 * 解决的方法: http://blog.csdn.net/ysughw/article/details/9288307
		 */
		// TreeMap<String,Object> treeMap1 = new TreeMap<String, Object>();
		// treeMap1.put("asd", null);
		// treeMap1.put("猪头", "zhutou");
		// dataList.add(treeMap1);
		map.put(ExcelUtils.HEADERINFO, headList);
		map.put(ExcelUtils.DATAINFON, dataList);
		writeExcel("E:/test1.xlsx", map, wb);//往wb里面写map中内容,生成E:/test1.xlsx这个文件....
	}
}
时间: 2024-08-04 03:37:59

使用POI来实现对Excel的读写操作的相关文章

使用jxl操作之一: 实现对Excel简单读写操作

项目目录树 对象类UserObject UserObject.java package com.dlab.jxl; public class UserObject { private String userName; private String age; private String address; public String getUserName() { return userName; } public void setUserName(String userName) { this.

利用C#实现对excel的写操作

一.COM interop 首先我们要了解下何为COM Interop,它是一种服务,可以使.NET Framework对象能够与COM对象通信.Visual Studio .NET 通过引入面向公共语言运行时的托管代码概念,改变了开发人员在创建和运行应用程序的方式.但是这也使得它与基于Windows API和COM对象的编程有了本质的去比.Visual Studio .NET让托管对象和非托管对象协同工作的过程能够称为互用性(interoperability),通常简称为interop. 二.

python实现对excel表的读写操作(一)

Part 1. 模块介绍: 使用python实现对excel表的读写操作有两个模块,分别为: 1. 对excel表读取模块 xlrd 0.9.3  :下载地址: https://pypi.python.org/pypi/xlrd 英文释意:The package is for reading data and formatting information from Excel files. 2. 对excel表写入模块 xlwt 0.7.5 : 下载地址:https://pypi.python.

C#实现对Word文件读写[转]

手头上的一个项目报表相对比较简单,所以报表打印采用VBA引擎,通过定制Word模版,然后根据模版需要填充数据,然后OK,打印即可. 实现方法:首先需要引用VBA组建,我用的是Office2003 Professional,Dll版本号为Microsoft Word11.0 另外当然还需要引用Interop.Word.Dll. 代码如下: ///#region 打开Word文档,并且返回对象wDoc,wDoc /// /// 打开Word文档,并且返回对象wDoc,wDoc /// /// 完整W

php如何利用python实现对pdf文件的操作(读写、合并分割)

php如何利用python实现对pdf文件的操作 需求:在PHP里实现了把8.pdf的前4页pdf文件截取出来生成新的pdf文件. 详细步骤如下: 1. 安装python第三方库PyPDF2 前提:python必须是3.x版本以上,必要时需要升级pip3,命令如下:pip3 install --upgrade pipPyPDF 自 2010年 12月开始就不在更新了,PyPDF2 接棒 PyPDF, 在此使用PyPDF2. 安装命令:pip install PyPDF2 2.编写python脚本

Python—对Excel进行读写操作

学习Python的过程中,我们会遇到Excel的读写问题.通过搜索得知,我们可以使用xlwt module将数据写入Excel表格,使用xlrd module从Excel读取数据.下面介绍如何实现使用python对Excel进行读写操作. (1)对Excel的写操作: # -*- coding: utf-8 -*- #导入xlwt模块 import xlwt # 创建一个Workbook对象,这就相当于创建了一个Excel文件 book = xlwt.Workbook(encoding='utf

78、excel的读写操作

本篇主要是用python来自动生成excel数据文件也就是简单的excel读写操作.python读写excel文件主要是第三方模块库xlrd.xlwt. 本篇导航: 写excel 读excel 一.写excel 1.准备工作 pip install xlwt 2.写excel import xlwt wb = xlwt.Workbook() sheet = wb.add_sheet('sheet1') for row in range(10): for col in range(5): shee

在Asp.Net MVC中使用NPOI插件实现对Excel的操作(导入,导出,合并单元格,设置样式,输入公式)

前言 NPOI 是 POI 项目的.NET版本,它不使用 Office COM 组件,不需要安装 Microsoft Office,目前支持 Office 2003 和 2007 版本. 1.整个Excel表格叫做工作表:WorkBook(工作薄),包含的叫页(工作表):Sheet:行:Row:单元格Cell. 2.NPOI是POI的C#版本,NPOI的行和列的index都是从0开始 3.POI读取Excel有两种格式一个是HSSF,另一个是XSSF. HSSF和XSSF的区别如下: HSSF

Java实现对Excel文件的读取、操作

1.项目所需jar包,poi-3.9-20121203.jar,poi-ooxml-3.9.jar,poi-ooxml-schemas-3.9.jar 2.案例参考 import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.te