java操作Excel表格

6 篇文章 0 订阅
1 篇文章 0 订阅

java操作Excel表格

1、介绍

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

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

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

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

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

2.1下载jar

  1. 官方下载:http://poi.apache.org/download.html这里可以下载到它的最新版本和文档
  2. 将根目录下的poi-3.6-20091214.jar和Lib目录下三个通用包 commons-logging-1.1.jar junit-3.8.1.jar log4j-1.2.13.jar拷贝到项目的Lib下

2.2maven项目添加pom依赖

<!-- 导出Excel依赖jar包 https://mvnrepository.com/artifact/org.apache.poi/poi -->
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>3.6</version>
		</dependency>

2.3Jakarta POI HSSF API组件

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

常用组件
HSSFWorkbookexcel的文档对象
HSSFSheetexcel的表单
HSSFRowexcel的行
HSSFCellexcel的格子单元
HSSFFontexcel字体
HSSFDataFormat日期格式
HSSFHeadersheet头
HSSFFootersheet尾(只有打印的时候才能看到效果)
常用组件
HSSFFootersheet尾(只有打印的时候才能看到效果)
HSSFCellStylecell样式
辅助操作包括
HSSFDateUtil日期
HSSFPrintSetup打印
HSSFErrorConstants错误信息表

3. java导出Excel

  1. 创建ExcelUtil工具类
package com.dx.mecvip.util;

import java.io.UnsupportedEncodingException;
import java.util.List;

import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
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.ss.util.Region;

/**
 1. @author fang
 2.  3. @Date 2018年12月12日
 4.  5.       项目名 mecvip
 6.  7. @version 1.0
 */
@SuppressWarnings("deprecation")
public class ExcelUtil {
	private HSSFWorkbook wb = null;// 得到Excel工作簿对象
	private HSSFSheet sheet = null;// 得到Excel工作表对象

	public ExcelUtil(HSSFWorkbook wb, HSSFSheet sheet) {
		this.wb = wb;
		this.sheet = sheet;
	}

	/**
	 * 导出Excel
	 * 
	 * @param sheetName
	 *            sheet名称
	 * @param title
	 *            标题
	 * @param values
	 *            内容
	 * @param wb
	 *            HSSFWorkbook对象
	 * @return
	 */
	public static HSSFWorkbook getHSSFWorkbook(String sheetName, String[] title, String[][] values, HSSFWorkbook wb) {

		// 第一步,创建一个HSSFWorkbook,对应一个Excel文件
		if (wb == null) {
			wb = new HSSFWorkbook();
		}

		// 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet
		HSSFSheet sheet = wb.createSheet(sheetName);
		// 设置行高和行宽
		sheet.setDefaultColumnWidth(25);
		// sheet.setDefaultRowHeight((short)800);
		// sheet.setColumnWidth(1, 100 * 256);

		// 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制
		HSSFRow row = sheet.createRow(0);

		// 第四步,创建表头单元格,并设置值表头 设置表头居中
		HSSFCellStyle styleHeader = wb.createCellStyle();
		styleHeader.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定单元格居中对齐
		styleHeader.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定单元格垂直居中对齐
		styleHeader.setWrapText(true);// 指定单元格自动换行
		// 设置表头单元格字体
		HSSFFont fontHeader = wb.createFont();
		fontHeader.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		fontHeader.setFontName("微软雅黑");// 字体
		fontHeader.setFontHeightInPoints((short) 12);// 设置字体
		styleHeader.setFont(fontHeader);

		// 第五步,创建内容单元格,并设置内容单元格样式
		HSSFCellStyle styleBody = wb.createCellStyle();
		styleBody.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定单元格居中对齐
		styleBody.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定单元格垂直居中对齐
		styleBody.setWrapText(true);// 指定单元格自动换行
		// 设置表头单元格字体
		HSSFFont fontBody = wb.createFont();
		fontBody.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		fontBody.setFontName("仿宋");// 字体
		fontBody.setFontHeightInPoints((short) 12);// 设置字体
		styleBody.setFont(fontBody);

		// 设置单元格背景色
		// styleHeader.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
		// styleHeader.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

		// 声明列对象
		HSSFCell cell = null;

		// 创建标题
		for (int i = 0; i < title.length; i++) {
			// 设置标题行高度
			row.setHeight((short) 800);
			cell = row.createCell(i);
			// 定义单元格为字符串类型
			cell.setCellType(HSSFCell.ENCODING_UTF_16);// 中文处理
			cell.setCellStyle(styleHeader);
			cell.setCellValue(title[i]);
		}

		// 创建内容
		for (int i = 0; i < values.length; i++) {
			row = sheet.createRow(i + 1);
			// 设置内容行高度
			row.setHeight((short) 800);
			for (int j = 0; j < values[i].length; j++) {
				cell = row.createCell(j);
				// 定义单元格为字符串类型
				cell.setCellType(HSSFCell.ENCODING_UTF_16);// 中文处理
				cell.setCellStyle(styleBody);
				// 将内容按顺序赋给对应的列对象
				cell.setCellValue(values[i][j]);
			}
		}
		return wb;
	}

	/**
	 * 创建合计行
	 *
	 * @param colSum
	 *            需要合并到的列索引
	 * @param cellValue
	 */
	public void createLastSumRow(int colSum, List<String> list) {
		// 定义单元格格式,添加单元格表样式,并添加到工作簿
		HSSFCellStyle cellStyle = wb.createCellStyle();
		cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定单元格居中对齐
		cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定单元格垂直居中对齐
		cellStyle.setWrapText(true);// 指定单元格自动换行

		// 单元格字体
		HSSFFont font = wb.createFont();
		font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		font.setFontName("宋体");
		font.setFontHeight((short) 250);
		cellStyle.setFont(font);
		// 获取工作表最后一行
		HSSFRow lastRow = sheet.createRow((short) (sheet.getLastRowNum() + 1));
		HSSFCell sumCell = lastRow.createCell(0);// 创建Excel工作表指定行的单元格

		sumCell.setCellValue(new HSSFRichTextString("合计"));
		sumCell.setCellStyle(cellStyle);
		// 合并 最后一行的第零列-最后一行的第一列
		sheet.addMergedRegion(new Region(sheet.getLastRowNum(), (short) 0, sheet.getLastRowNum(), (short) colSum));// 指定合并区域

		for (int i = 2; i < (list.size() + 2); i++) {
			// 定义最后一行的第三列
			sumCell = lastRow.createCell(i);
			sumCell.setCellStyle(cellStyle);
			// 定义数组 从0开始。
			sumCell.setCellValue(new HSSFRichTextString(list.get(i - 2)));
		}
	}

	// 发送响应流方法
	public static void setResponseHeader(HttpServletResponse response, String fileName) {
		try {
			try {
				fileName = new String(fileName.getBytes(), "ISO8859-1");
			} catch (UnsupportedEncodingException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			response.setContentType("application/octet-stream;charset=ISO8859-1");
			response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
			response.addHeader("Pargam", "no-cache");
			response.addHeader("Cache-Control", "no-cache");
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}
}
  1. 业务执行代码:
@SuppressWarnings("null")
	@RequestMapping(value = "/exportWC.dx")
	@ResponseBody
	public void export(HttpServletRequest request, HttpServletResponse response) {
		// 获取数据
		// List<PageData> list = reportService.bookList(page);
		// excel标题
		String[] title = { "值班室", "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
		// excel文件名
		String fileName = "值班表.xls";

		// sheet名
		String sheetName = "值班表";
		int size = roomList.size();
		String[][] content = new String[size][];
		/*下面是自己业务代码,将自己的表格内容(不含表头)填充到自己的Excel表格中*/
		// 查询所有值班室
		List<Room> roomList = roomService.selectAllRoom();
		String weekdays[] = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
		for (int i = 0; i < size; i++) {
			for (int j = 1; j < title.length; j++) {
				content[i] = new String[title.length];
				content[i][0] = roomList.get(i).getName();
				for (int s = 0; s < weekdays.length; s++) {
					map.clear();
					map.put("weekday", weekdays[s]);
					map.put("rid", roomList.get(i).getId());
					Workcalendar workcalendar = workcalendarService.selectWorkcalendar(map);
					if (workcalendar != null) {
						content[i][s + 1] = workcalendar.getUser().getName();
					}
				}

			}
		}

		// 创建HSSFWorkbook
		HSSFWorkbook wb = ExcelUtil.getHSSFWorkbook(sheetName, title, content, null);

		// 响应到客户端
		try {
			ExcelUtil.setResponseHeader(response, fileName);
			OutputStream os = response.getOutputStream();
			wb.write(os);
			os.flush();
			os.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

4.java导入Excel表格

待完善。。。
可参考大神文档:https://www.cnblogs.com/hanfeihanfei/p/7079210.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值