• 使用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 + "	");
    			}
    			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("	"+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 + "	");//
    			}
    
    			// 打印指定列
    			// 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("	"+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 + "	");
    			}
    			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("	"+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这个文件....
    	}
    }
    






  • 相关阅读:
    dpdk学习笔记2
    <c和指针>学习笔记2之数据和语句
    dpdk数据包捕获技术笔记1
    <c++primer plus>学习笔记1之第八章函数探幽
    准备面试的那些事儿1
    tcp_fast_open的概念 作用以及实现(转)
    tcp/ip详解(转)
    Build step 'Execute Windows batch command' marked build as failure
    vmware12如何安装macOSX虚拟机
    如何将exe注册为windows服务,直接从后台运行
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5155648.html
Copyright © 2020-2023  润新知