`

Java操作Excel By Apache POI Or jExcelApi

    博客分类:
  • Java
阅读更多

 

前端时间有个.NET项目中涉及到了C#Excel表格的操作,因为以前没弄过使用Java实现相关操作,所以想看看JavaExcel表格的支持,我们知道JavaJDK里并没有提供对微软Excel的支持,但是Java可以利用很多第三方开源项目,所以应该也会有第三方开源项目对Excel的读写操作提供支持。

通过在网上的查找、学习,分析出大概有两个比较好的java操作excel的工具,一个是POI,另一个是jExcelAPI,对于这两个,网上普遍是这么认为的:POI功能比jExcelAPI强大点,但jExcelAPI对中文支持非常好,API是纯Java的, 并不依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件。 另外需要说明的是,这套API对图形和图表的支持很有限,而且仅仅识别PNG格式。我们先不管具体谁好谁坏,都实现一个相同的功能大家比较一下,大家心里就会有了自己的认识了。

下面来分别说说这两个。

jExcelAPI

网上是这样对jExcelAPI进行说明的:

支持Excel 95-2000的所有版本

生成Excel 2000标准格式

支持字体、数字、日期操作

能够修饰单元格属性

支持图像和图表

正如我上面说的最主要的是这套API是纯Java写的,所以不依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件。

官网:http://jexcelapi.sourceforge.net/

 

WriteExcel.java:

package com.iflytek.excel_by_JXL;

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

import jxl.CellView;
import jxl.Sheet;
import jxl.Workbook;
import jxl.WorkbookSettings;
import jxl.format.Alignment;
import jxl.format.Colour;
import jxl.format.UnderlineStyle;
import jxl.format.VerticalAlignment;
import jxl.write.Formula;
import jxl.write.Label;
import jxl.write.Number;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableImage;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;

/**
 * 通过JXL创建Excel并想里面写入内容
 * 
 * @author xudongwang 2012-1-13
 * 
 *         Email:xdwangiflytek@gmail.com
 */

public class WriteExcel {

	/**
	 * 表头的格式
	 */
	private WritableCellFormat cellHeaderFormat;

	/**
	 * 表格内容的格式
	 */
	private WritableCellFormat cellContentFormat;
	/**
	 * 表格内容的格式2
	 */
	private WritableCellFormat cellContentFormat2;

	public static void main(String[] args) throws WriteException, IOException {
		WriteExcel writeExcel = new WriteExcel();
		writeExcel.write("D:/ExcelByJXL.xls");
		System.out.println("ExcelByJXL.xls创建成功!");
	}

	/**
	 * 向Excel表中写内容
	 * 
	 * @param score
	 *            Excel地址+Excel名称
	 */
	public void write(String score) {
		try {
			File file = new File(score);
			WorkbookSettings wbSettings = new WorkbookSettings();
			// wbSettings.setLocale(new Locale("en", "EN"));
			wbSettings.setLocale(new Locale("zh", "CN"));
			// 打开文件
			WritableWorkbook workbook = Workbook.createWorkbook(file,
					wbSettings);
			// 生成名为“第一个工作表”的工作表,参数0表示这是第一页
			workbook.createSheet("第一个工作表", 0);
			Sheet sheet2 = workbook.createSheet("第二个工作表", 1);

			// 获取第一个工作表,下标从0开始
			WritableSheet excelSheet = workbook.getSheet(0);
			
			initializeStyle(excelSheet);
			fillContent(excelSheet);

			workbook.write();
			workbook.close();
		} catch (RowsExceededException e) {
			e.printStackTrace();
		} catch (IndexOutOfBoundsException e) {
			e.printStackTrace();
		} catch (WriteException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 初始化表格里的样式
	 * 
	 * @param sheet
	 *            工作表
	 */
	private void initializeStyle(WritableSheet sheet) {
		try {
			// 定义表头单元格和内容单元格的样式
			// 添加一个粗体有下划线的表头
			WritableFont times10ptBoldUnderline = new WritableFont(
					WritableFont.TIMES, 10, WritableFont.BOLD, false,
					UnderlineStyle.SINGLE, Colour.GREEN);
			cellHeaderFormat = new WritableCellFormat(times10ptBoldUnderline);
			cellHeaderFormat.setBackground(Colour.RED);// 设置背景颜色

			// 设置水平对齐方式指定为居中
			cellHeaderFormat.setAlignment(Alignment.CENTRE);
			// 设置垂直对齐方式指定为居中
			cellHeaderFormat.setVerticalAlignment(VerticalAlignment.CENTRE);
			// 设置自动换行
			cellHeaderFormat.setWrap(false);

			// 定义字体
			// WritableFont.TIMES:对象创建的这个字体名称应在Excel随着时代的字体
			// 10表示字体的大小
			WritableFont times10pt = new WritableFont(WritableFont.TIMES, 10);
			// 定义内容单元格格式
			cellContentFormat = new WritableCellFormat(times10pt);
			cellContentFormat.setAlignment(Alignment.CENTRE);
			cellContentFormat.setVerticalAlignment(VerticalAlignment.CENTRE);
			cellContentFormat.setBackground(Colour.BLUE);
			cellContentFormat.setWrap(false);

			WritableFont times10pt2 = new WritableFont(WritableFont.TIMES, 10);
			cellContentFormat2 = new WritableCellFormat(times10pt2);
			cellContentFormat2.setAlignment(Alignment.CENTRE);
			cellContentFormat2.setVerticalAlignment(VerticalAlignment.CENTRE);
			cellContentFormat2.setBackground(Colour.ROSE);
			cellContentFormat2.setWrap(false);

			CellView cellView = new CellView();
			cellView.setFormat(cellHeaderFormat);
			cellView.setFormat(cellContentFormat);
			cellView.setFormat(cellContentFormat2);
			cellView.setAutosize(true);
			
		} catch (RowsExceededException e) {
			e.printStackTrace();
		} catch (WriteException e) {
			e.printStackTrace();
		}

	}

	/**
	 * 向表格中写入内容
	 * 
	 * @param sheet
	 *            工作表
	 */
	private void fillContent(WritableSheet sheet) {
		try {
			
			addHeader(sheet, 0, 0, "第一个表头");
			addHeader(sheet, 1, 0, "第二个表头");

			// 指定行高度和列宽度
			sheet.setRowView(0, 600);// 设置第一行高度为500
			sheet.setColumnView(0, 40);// 指定第1列的宽度
			sheet.setColumnView(1, 40);// 指定第2列的宽度
			// 向表格中写入数字
			for (int i = 1; i < 10; i++) {
				addNumber(sheet, 0, i, i + 10);
				addNumber(sheet, 1, i, i * i);
			}
			// 计算总和
			StringBuffer buf = new StringBuffer();
			buf.append("SUM(A2:A10)");
			// A cell, created by user applications, which contains a numerical
			// value
			// 第一个参数表示列,第二个参数表示行,第三个参数表示值,第四个参数表示指定格式
			WritableCellFormat sumFormat = new WritableCellFormat(
					new WritableFont(WritableFont.TIMES, 10, WritableFont.BOLD));
			sumFormat.setAlignment(Alignment.CENTRE);
			Formula formula = new Formula(0, 10, buf.toString(), sumFormat);
			// 将表格添加到工作表中去
			sheet.addCell(formula);
			buf = new StringBuffer();
			buf.append("SUM(B2:B10)");
			formula = new Formula(1, 10, buf.toString(), sumFormat);
			sheet.addCell(formula);

			// 合并单元格
			// 表示合并第1列第11行到第2列第11行
			sheet.mergeCells(0, 11, 1, 11);
			WritableCellFormat hebingFormat = new WritableCellFormat(
					new WritableFont(WritableFont.TIMES, 10, WritableFont.BOLD));
			hebingFormat.setAlignment(Alignment.CENTRE);
			sheet.addCell(new Label(0, 11, "单元格合并", hebingFormat));
			// 上面需要注意的是合并可以是横向的,可以是纵向的,但合并后的单元格不能再次进行合并,否则会触发异常

			// 想表格中写入字符串
			for (int i = 12; i < 20; i++) {
				addLabel(sheet, 0, i, "第一列内容:" + i);
				addLabel(sheet, 1, i, "第二列内容:" + i);
			}

			// 添加图片
			File imageFile = new File("D:\\apple.png");
			// 第一个参数表示从第几列开始,这里表示从第3列开始
			// 第二个参数表示从第几行开始,这里表示从第二行开始
			// 第三个参数表示图片占用几列
			// 第四个参数表示图片占用几行
			// 第五个参数表示图片对象
			WritableImage image = new WritableImage(2, 1, 2, 5, imageFile);
			sheet.addImage(image);

		} catch (RowsExceededException e) {
			e.printStackTrace();
		} catch (WriteException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 添加表头
	 * 
	 * @param sheet
	 *            工作表
	 * @param column
	 *            列数,从0开始
	 * @param row
	 *            行数,从0开始
	 * @param headerName
	 *            表头名称
	 */
	private void addHeader(WritableSheet sheet, int column, int row,
			String headerName) {
		try {
			Label label;
			label = new Label(column, row, headerName, cellHeaderFormat);
			sheet.addCell(label);
		} catch (RowsExceededException e) {
			e.printStackTrace();
		} catch (WriteException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 向表格中写入整型数字
	 * 
	 * @param sheet
	 *            工作表
	 * @param column
	 *            列数,从0开始
	 * @param row
	 *            行数,从0开始
	 * @param integer
	 *            需要想表格中写入的整型
	 */
	private void addNumber(WritableSheet sheet, int column, int row,
			Integer integer) {
		try {
			Number number;
			if (row % 2 == 0) {
				number = new Number(column, row, integer, cellContentFormat);
			} else {
				number = new Number(column, row, integer, cellContentFormat2);
			}
			sheet.addCell(number);
		} catch (RowsExceededException e) {
			e.printStackTrace();
		} catch (WriteException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 向表格中写入字符串
	 * 
	 * @param sheet
	 *            工作表
	 * @param column
	 *            列数,从0开始
	 * @param row
	 *            行数,从0开始
	 * @param content
	 *            需要写入表格中的内容
	 */
	private void addLabel(WritableSheet sheet, int column, int row, String content) {
		try {
			Label label;
			if (row % 2 == 0) {
				label = new Label(column, row, content, cellContentFormat);
			} else {
				label = new Label(column, row, content, cellContentFormat2);
			}
			sheet.addCell(label);
		} catch (RowsExceededException e) {
			e.printStackTrace();
		} catch (WriteException e) {
			e.printStackTrace();
		}
	}

}

 

 运行效果:

 

通过上面的Demo基本上可以满足我们正常项目开发中的所有需求了,需要注意的是上面的Demo是在你将jexcelapi(我使用的是jexcelapi_2_6_12)里的jxl.jar加载到lib下。

 

ReadExcel.java:

package com.iflytek.excel_by_JXL;

import java.io.File;
import java.io.IOException;

import jxl.Cell;
import jxl.CellType;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;

/**
 * 读取Excel表格里的内容
 * 
 * @author xudongwang 2012-1-13
 * 
 *         Email:xdwangiflytek@gmail.com
 */

public class ReadExcel {

	public static void main(String[] args) throws IOException {
		ReadExcel readExcel = new ReadExcel();
		readExcel.read("D:/ExcelByJXL.xls");
	}

	/**
	 * 读取Excel内容
	 * 
	 * @param source
	 *            Excel地址+Excel名称
	 */
	public void read(String source) {
		File inputWorkbook = new File(source);
		Workbook workBook;
		try {
			workBook = Workbook.getWorkbook(inputWorkbook);
			// 获取第一个工作表
			Sheet sheet = workBook.getSheet(0);
			for (int j = 0; j < sheet.getColumns(); j++) {
				for (int i = 0; i < sheet.getRows(); i++) {
					//第一个参数表示列,第二个参数表示行
					Cell cell = sheet.getCell(j, i);
					CellType type = cell.getType();
					if (cell.getType() == CellType.LABEL) {
						System.out.println("获取到的字符串为:"
								+ cell.getContents());
					}
					if (cell.getType() == CellType.NUMBER) {
						System.out.println("获取到的数字是:"
								+ cell.getContents());
					}
				}
			}
		} catch (BiffException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

 

 

Apache POI

首先先简单介绍一下Apache POI,通过名称可以发现这又是Apache的一款开源项目,在POI里面,它把很多Excel里的元素都对象化了,这和符合Java的编程风格。

Apache POI提供的文档中:

 

 

可以发现Apache POI不仅仅支持Excel,还支持WordPowerPoint等等,但是为了与jExcelAPI操作Excel有一定的对比,这里我们先讲一下Apache POIExcel的操作。

首先我们需要了解Apache POI操作Excel的两个概念,HSSFXSSF,文档中是这样定义的(HSSF is the POI Project's pure Java implementation of the Excel '97(-2007) file format. XSSF is the POI Project's pure Java implementation of the Excel 2007 OOXML (.xlsx) file format)即HSSF是老版本的,XSSF是新版本的。在3.8版本时又提出了一个SXSSFSXSSF是继承XSSF的,通过文档里的描述SXSSF在处理大数据的时候进行了优化。

官网:http://poi.apache.org/index.html

因为现在高版本可以兼容低版本,所以我们使用HSSF进行相关操作

注意在使用图片的时候需要导入commons-codec-1.6.jar

 下载地址:http://commons.apache.org/codec/download_codec.cgi

 

WriteExcel.java

package com.iflytek.excel_by_POI;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.CellRangeAddress;
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.ClientAnchor;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Picture;
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.ss.util.WorkbookUtil;
import org.apache.poi.util.IOUtils;

/**
 * 通过POI创建并向Excel里写入内容
 * 
 * @author xudongwang 2012-1-13
 * 
 *         Email:xdwangiflytek@gmail.com
 */
public class WriteExcel {

	/**
	 * 表头的格式
	 */
	private CellStyle headerCellStyle;

	/**
	 * 表格内容的格式
	 */
	private CellStyle contentCellStyle;

	/**
	 * 表格内容的格式2
	 */
	private CellStyle contentCellStyle2;

	/**
	 * 合并单元格的样式
	 */
	private CellStyle hebingCellStyle;

	public static void main(String[] args) {
		WriteExcel writeExcel = new WriteExcel();
		writeExcel.writer("D:\\ExcelByPOI.xls");
		System.out.println("ExcelByPOI.xls创建成功。");
	}

	/**
	 * 创建Excel
	 * 
	 * @param source
	 *            Excel地址+Excel名称
	 */
	public void writer(String source) {
		try {
			// 创建workbook
			Workbook workBook = new HSSFWorkbook();

			// 注意这里工作表的名称不能超过31个字符,并且不能包含一些特殊字符,所以这里为了安全操作,POI提供了WorkbookUtil里的createSafeSheetName方法
			String safeName = WorkbookUtil.createSafeSheetName("第一个工作表");
			workBook.createSheet(safeName);
			Sheet sheet2 = workBook.createSheet("第二个工作表");
			Sheet sheet = workBook.getSheetAt(0);

			initializeStyle(sheet, workBook);
			fillContent(sheet, workBook);

			FileOutputStream fileOut = new FileOutputStream(source);
			workBook.write(fileOut);
			fileOut.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 初始化表格里的样式
	 * 
	 * @param sheet
	 *            工作表
	 * @param workBook
	 */
	private void initializeStyle(Sheet sheet, Workbook workBook) {
		// 定义表头样式和内容样式
		headerCellStyle = workBook.createCellStyle();
		// 设置背景颜色,这里直接设置背景色没设上,不知道为什么??
		headerCellStyle.setFillPattern(CellStyle.FINE_DOTS);
		headerCellStyle.setFillForegroundColor(IndexedColors.RED.index);
		headerCellStyle.setFillBackgroundColor(IndexedColors.RED.index);
		// 设置水平对齐方式
		headerCellStyle.setAlignment(CellStyle.ALIGN_CENTER);
		// 设置是否自动换行
		headerCellStyle.setWrapText(false);
		// 设置垂直对齐方式
		headerCellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
		Font headerFont = workBook.createFont();
		headerFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
		headerFont.setColor(HSSFColor.GREEN.index);
		headerFont.setUnderline(Font.U_SINGLE);
		// 设置字体
		headerCellStyle.setFont(headerFont);

		contentCellStyle = workBook.createCellStyle();
		contentCellStyle.setFillPattern(CellStyle.FINE_DOTS);
		contentCellStyle.setFillForegroundColor(IndexedColors.ROSE.index);
		contentCellStyle.setFillBackgroundColor(IndexedColors.ROSE.index);
		contentCellStyle.setAlignment(CellStyle.ALIGN_CENTER);
		contentCellStyle.setWrapText(false);
		contentCellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);

		contentCellStyle2 = workBook.createCellStyle();
		contentCellStyle2.setFillPattern(CellStyle.FINE_DOTS);
		contentCellStyle2.setFillForegroundColor(IndexedColors.BLUE.index);
		contentCellStyle2.setFillBackgroundColor(IndexedColors.BLUE.index);
		contentCellStyle2.setAlignment(CellStyle.ALIGN_CENTER);
		contentCellStyle2.setWrapText(false);
		contentCellStyle2.setVerticalAlignment(CellStyle.VERTICAL_CENTER);

		hebingCellStyle = workBook.createCellStyle();
		hebingCellStyle.setAlignment(CellStyle.ALIGN_CENTER);
		hebingCellStyle.setWrapText(false);
		Font hebingFont = workBook.createFont();
		hebingFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
		hebingCellStyle.setFont(hebingFont);
		hebingCellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
	}

	/**
	 * 向表格中写入内容
	 * 
	 * @param sheet
	 *            工作表
	 * @param workBook
	 */
	private void fillContent(Sheet sheet, Workbook workBook) {

		// 下面是添加表头
		Row headerRow = sheet.createRow(0);
		addHeader(sheet, workBook, headerRow, 0, "第一个表头");
		addHeader(sheet, workBook, headerRow, 1, "第二个表头");
		for (int i = 0; i < 2; i++) {
			// 设置列的高度,第一个参数表示列的索引,
			sheet.setColumnWidth(i, 12000);
		}
		for (int i = 1; i < 10; i++) {
			Row contentRow = sheet.createRow(i);
			addNumber(sheet, workBook, contentRow, i, 0, i + 10);
			addNumber(sheet, workBook, contentRow, i, 1, i * i);
		}

		// 计算总和
		Row sumRow = sheet.createRow(10);
		Cell sumCell0 = sumRow.createCell(0);
		sumCell0.setCellFormula("SUM(A2:A10)");
		sumCell0.setCellStyle(hebingCellStyle);
		Cell sumCell1 = sumRow.createCell(1);
		sumCell1.setCellFormula("SUM(B2:B10)");
		sumCell1.setCellStyle(hebingCellStyle);

		// 第一个参数first row (0-based)
		// 第二个参数last row (0-based)
		// 第三个参数first column (0-based)
		// 第四个参数last column (0-based)
		sheet.addMergedRegion(new CellRangeAddress(11, 11, 0, 1));
		Row hebingRow = sheet.createRow(11);
		Cell hebingCell = hebingRow.createCell(0);
		hebingCell.setCellValue("合并单元格");

		hebingCell.setCellStyle(hebingCellStyle);

		for (int i = 12; i < 20; i++) {
			Row contentRow = sheet.createRow(i);
			addLable(sheet, workBook, contentRow, i, 0, "第一列内容:" + i);
			addLable(sheet, workBook, contentRow, i, 1, "第二列内容:" + i);
		}

		// 添加图片
		try {
			InputStream is = new FileInputStream("D:\\apple.png");
			byte[] bytes = IOUtils.toByteArray(is);
			int pictureIdx = workBook.addPicture(bytes,
					Workbook.PICTURE_TYPE_PNG);
			is.close();
			CreationHelper helper = workBook.getCreationHelper();
			Drawing drawing = sheet.createDrawingPatriarch();
			ClientAnchor anchor = helper.createClientAnchor();
			// 下面表示图片开始的行号和列号,都是从0开始的
			anchor.setCol1(2);
			anchor.setRow1(1);
			Picture pict = drawing.createPicture(anchor, pictureIdx);
			pict.resize();

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	/**
	 * 添加表头信息
	 * 
	 * @param sheet
	 *            工作表
	 * @param workBook
	 * @param headerRow
	 *            行对象
	 * @param column
	 *            列数,从0开始
	 * 
	 * @param headerName
	 *            表头名称
	 */
	public void addHeader(Sheet sheet, Workbook workBook, Row headerRow,
			int column, String headerName) {
		headerRow.setHeight((short) 500);// 注意setCellValue里可以放的类型有多种
		Cell cell = headerRow.createCell(column);// 第一行从0开始,第一列也是从0开始
		cell.setCellValue(headerName);// 注意setCellValue里可以放的类型有多种
		cell.setCellStyle(headerCellStyle);
	}

	/**
	 * 向表格中写入字符串
	 * 
	 * @param sheet
	 *            工作表
	 * @param workBook
	 * @param contentRow
	 *            指定Row对象
	 * @param row
	 *            行数数,从0开始
	 * @param column
	 *            列数,从0开始
	 * @param content
	 *            表格内容
	 */
	public void addLable(Sheet sheet, Workbook workBook, Row contentRow,
			int row, int column, String content) {

		Cell cell = contentRow.createCell(column);
		cell.setCellValue(content);
		if (row % 2 == 0) {
			cell.setCellStyle(contentCellStyle2);
		} else {
			cell.setCellStyle(contentCellStyle);
		}

	}

	/**
	 * 向表格中写入整型
	 * 
	 * @param sheet
	 *            工作表
	 * @param workBook
	 * @param contentRow
	 *            指定Row对象
	 * @param row
	 *            行数,从0开始
	 * @param column
	 *            列数,从0开始
	 * @param content
	 *            表格内容(整型)
	 */
	public void addNumber(Sheet sheet, Workbook workBook, Row contentRow,
			int row, int column, int content) {

		Cell cell = contentRow.createCell(column);
		cell.setCellValue(content);
		if (row % 2 == 0) {
			cell.setCellStyle(contentCellStyle2);
		} else {
			cell.setCellStyle(contentCellStyle);
		}

	}
}

 

 运行效果:

 

ReadExcel.java

package com.iflytek.excel_by_POI;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Iterator;

import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;

/**
 * @author xudongwang 2012-1-14
 * 
 *         Email:xdwangiflytek@gmail.com
 */
public class ReadExcel {

	public static void main(String[] args) {
		ReadExcel readExcel = new ReadExcel();
		readExcel.read("D:/ExcelByPOI.xls");
	}

	/**
	 * 读取Excel内容
	 * 
	 * @param source
	 *            Excel地址+Excel名称
	 */
	public void read(String source) {
		try {
			File file = new File(source);
			FileInputStream fint = new FileInputStream(file);
			POIFSFileSystem poiFileSystem = new POIFSFileSystem(fint);
			HSSFWorkbook workbook = new HSSFWorkbook(poiFileSystem);
			HSSFSheet sheet = workbook.getSheetAt(0);
			for (Iterator<Row> rit = sheet.rowIterator(); rit.hasNext();) {
				Row row = rit.next();
				for (Iterator<Cell> cit = row.cellIterator(); cit.hasNext();) {
					Cell cell = cit.next();
					System.out.println(getCell(cell));
				}
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	  public String getCell(Cell cell) {
		    if (cell == null)
		      return "";
		    switch (cell.getCellType()) {
		      case Cell.CELL_TYPE_NUMERIC:
		        return cell.getNumericCellValue() + "";
		      case Cell.CELL_TYPE_STRING:
		        return cell.getStringCellValue();
		      case Cell.CELL_TYPE_FORMULA:
		        return cell.getCellFormula();
		      case Cell.CELL_TYPE_BLANK:
		        return "";
		      case Cell.CELL_TYPE_BOOLEAN:
		        return cell.getBooleanCellValue() + "";
		      case Cell.CELL_TYPE_ERROR:
		        return cell.getErrorCellValue() + "";
		    }
		    return "";
		  }
}

 对于其他没涉及到的功能,可以查阅提供的文档,里面说的还是比较清楚的;

 

 

 

 

 

 

 

  • 大小: 93 KB
  • 大小: 101.6 KB
  • 大小: 5.1 KB
5
1
分享到:
评论

相关推荐

    查看进程信息,方便排查问题

    查看进程信息,方便排查问题

    IDA Pro分析STM32F1xx插件

    IDA Pro分析STM32F1xx插件

    基于SSH的线上医疗报销系统.zip-毕设&课设&实训&大作业&竞赛&项目

    项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用

    matlab的小型的微电网仿真模型文件

    小型的微电网仿真模型,简单模拟了光伏,家庭负载变化的使用情况

    MATLAB代码实现:分布式电源接入对配电网运行影响深度分析与评估,MATLAB代码分析:分布式电源接入对配电网运行影响评估,MATLAB代码:分布式电源接入对配电网影响分析 关键词:分布式电源 配电

    MATLAB代码实现:分布式电源接入对配电网运行影响深度分析与评估,MATLAB代码分析:分布式电源接入对配电网运行影响评估,MATLAB代码:分布式电源接入对配电网影响分析 关键词:分布式电源 配电网 评估 参考文档:《自写文档,联系我看》参考选址定容模型部分; 仿真平台:MATLAB 主要内容:代码主要做的是分布式电源接入场景下对配电网运行影响的分析,其中,可以自己设置分布式电源接入配电网的位置,接入配电网的有功功率以及无功功率的大小,通过牛顿拉夫逊法求解分布式电源接入后的电网潮流,从而评价分布式电源接入前后的电压、线路潮流等参数是否发生变化,评估配电网的运行方式。 代码非常精品,是研究含分布式电源接入的电网潮流计算的必备程序 ,分布式电源; 配电网; 接入影响分析; 潮流计算; 牛顿拉夫逊法; 电压评估; 必备程序。,基于MATLAB的分布式电源对配电网影响评估系统

    基于Unity-Bolt开发的游戏demo.zip

    项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用

    重庆市农村信用合作社 农商行数字银行系统建设方案.ppt

    重庆市农村信用合作社 农商行数字银行系统建设方案.ppt

    光伏并网逆变器设计方案与高效实现:结合matlab电路仿真、DSP代码及环流抑制策略,光伏并网逆变器设计方案:结合matlab电路文件与DSP程序代码,实现高效并联环流抑制策略,光伏并网逆变器设计方案

    光伏并网逆变器设计方案与高效实现:结合matlab电路仿真、DSP代码及环流抑制策略,光伏并网逆变器设计方案:结合matlab电路文件与DSP程序代码,实现高效并联环流抑制策略,光伏并网逆变器设计方案,附有相关的matlab电路文件,以及DSP的程序代码,方案、仿真文件、代码三者结合使用效果好,事半功倍。 备注:赠送逆变器并联环流matlab文件,基于矢量控制的环流抑制策略和下垂控制的环流抑制 ,光伏并网逆变器设计方案; MATLAB电路文件; DSP程序代码; 方案、仿真文件、代码结合使用; 并联环流抑制策略; 下垂控制的环流抑制,光伏并网逆变器优化设计:方案、仿真与DSP程序代码三合一,并赠送并联环流抑制策略Matlab文件

    Matlab实现WOA-GRU鲸鱼算法优化门控循环单元的数据多输入分类预测(含模型描述及示例代码)

    内容概要:本文介绍了通过 Matlab 实现鲸鱼优化算法(WOA)与门控循环单元(GRU)结合的多输入分类预测模型。文章首先概述了时间序列预测的传统方法局限性以及引入 WOA 的优势。然后,重点阐述了项目背景、目标、挑战及其独特之处。通过详细介绍数据预处理、模型构建、训练和评估步骤,最终展示了模型的效果预测图及应用实例。特别强调利用 WOA 改善 GRU 的参数设置,提高了多输入时间序列预测的准确性与鲁棒性。 适合人群:对时间序列分析有兴趣的研究者,从事金融、能源、制造业等行业数据分析的专业人士,具备一定的机器学习基础知识和技术经验。 使用场景及目标:本项目旨在开发一个高度准确和稳定的多变量时间序列预测工具,能够用于金融市场预测、能源需求规划、生产调度优化等领域,为企业和个人提供科学决策依据。 其他说明:项目提供的源代码和详细的开发指南有助于学习者快速掌握相关技能,并可根据实际需求调整模型参数以适应不同的业务情境。

    基于vue+elment-ui+node.js的后台管理系统 .zip(毕设&课设&实训&大作业&竞赛&项目)

    项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用

    Python 实现基于BiLSTM-AdaBoost双向长短期记忆网络结合AdaBoost多输入分类预测(含模型描述及示例代码)

    内容概要:本文介绍了Python中基于双向长短期记忆网络(BiLSTM)与AdaBoost相结合的多输入分类预测模型的设计与实现。BiLSTM擅长捕捉时间序列的双向依赖关系,而AdaBoost则通过集成弱学习器来提高分类精度和稳定性。文章详述了该项目的背景、目标、挑战、特色和应用场景,并提供了详细的模型构建流程、超参数优化以及视觉展示的方法和技术要点。此外,还附有完整的效果预测图表程序和具体示例代码,使读者可以快速上手构建属于自己的高效稳定的时间序列预测系统。 适合人群:对深度学习特别是时序数据分析感兴趣的开发者或者科研工作者;正在探索高级机器学习技术和寻求解决方案的企业分析师。 使用场景及目标:适用于希望提升时间序列或多输入数据类别判定准确度的业务情境,比如金融市场的走势预估、医学图像分析中的病变区域判读或是物联网环境监测下设备状态预警等任务。目的是为了创建更加智能且可靠的预测工具,在实际应用中带来更精准可靠的结果。 其他说明:文中提供的所有Python代码片段和方法都可以直接运用于实践中,并可根据特定的问题进行相应调整和扩展,进一步改进现有系统的效能并拓展新的功能特性。

    maven-script-interpreter-javadoc-1.0-7.el7.x64-86.rpm.tar.gz

    1、文件内容:maven-script-interpreter-javadoc-1.0-7.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/maven-script-interpreter-javadoc-1.0-7.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、更多资源/技术支持:公众号禅静编程坊

    在云服务器上搭建MQTT服务器(超详细,一步到位)

    在云服务器上搭建MQTT服务器(超详细,一步到位)

    复现改进的L-SHADE差分进化算法求解最优化问题详解:附MATLAB源码与测试函数集,复现改进的L-SHADE差分进化算法求解最优化问题详解:MATLAB源码与测试集全攻略,复现改进的L-SHADE

    复现改进的L-SHADE差分进化算法求解最优化问题详解:附MATLAB源码与测试函数集,复现改进的L-SHADE差分进化算法求解最优化问题详解:MATLAB源码与测试集全攻略,复现改进的L-SHADE差分进化算法求最优化问题 对配套文献所提出的改进的L-SHADE差分进化算法求解最优化问题的的复现,提供完整MATLAB源代码和测试函数集,到手可运行,运行效果如图2所示。 代码所用测试函数集与文献相同:对CEC2014最优化测试函数集中的全部30个函数进行了测试验证,运行结果与文献一致。 ,复现; 改进的L-SHADE差分进化算法; 最优化问题求解; MATLAB源代码; 测试函数集; CEC2014最优化测试函数集,复现改进L-SHADE算法:最优化问题的MATLAB求解与验证

    天津大学:深度解读DeepSeek原理与效应.pdf

    天津大学:深度解读DeepSeek原理与效应.pdf 1.大语言模型发展路线图 2.DeepSeek V2-V3/R1技术原理 3DeepSeek效应 4.未来展望

    光伏混合储能微电网能量管理系统模型:基于MPPT控制的光伏发电与一阶低通滤波算法的混合储能系统优化管理,光伏混合储能微电网能量优化管理与稳定运行系统,光伏-混合储能微电网能量管理系统模型

    光伏混合储能微电网能量管理系统模型:基于MPPT控制的光伏发电与一阶低通滤波算法的混合储能系统优化管理,光伏混合储能微电网能量优化管理与稳定运行系统,光伏-混合储能微电网能量管理系统模型 系统主要由光伏发电模块、mppt控制模块、混合储能系统模块、直流负载模块、soc限值管理控制模块、hess能量管理控制模块。 光伏发电系统采用mppt最大跟踪控制,实现光伏功率的稳定输出;混合储能系统由蓄电池和超级电容组合构成,并采用一阶低通滤波算法实现两种储能介质间的功率分配,其中蓄电池响应目标功率中的低频部分,超级电容响应目标功率中的高频部分,最终实现对目标功率的跟踪响应;SOC限值管理控制,根据储能介质的不同特性,优化混合储能功率分配,进一步优化蓄电池充放电过程,再根据超级电容容量特点,设计其荷电状态区分管理策略,避免过充过放,维持系统稳定运行;最后,综合混合储能和系统功率平衡,针对光伏储能微电网的不同工况进行仿真实验,验证控制策略的有效性。 本模型完整无错,附带对应复现文献paper,容易理解,可塑性高 ,光伏; 混合储能系统; 能量管理; MPPT控制; 直流负载;

    Matlab算法下的A星路径规划改进版:提升搜索效率,优化拐角并路径平滑处理,Matlab下的A星算法改进:提升搜索效率、冗余拐角优化及路径平滑处理,Matlab算法代码 A星算法 路径规划A* As

    Matlab算法下的A星路径规划改进版:提升搜索效率,优化拐角并路径平滑处理,Matlab下的A星算法改进:提升搜索效率、冗余拐角优化及路径平滑处理,Matlab算法代码 A星算法 路径规划A* Astar算法仿真 传统A*+改进后的A*算法 Matlab代码 改进: ①提升搜索效率(引入权重系数) ②冗余拐角优化(可显示拐角优化次数) ③路径平滑处理(引入梯度下降算法配合S-G滤波器) ,Matlab算法代码; A星算法; 路径规划A*; Astar算法仿真; 传统A*; 改进A*算法; 提升搜索效率; 冗余拐角优化; 路径平滑处理; 权重系数; S-G滤波器。,Matlab中的A*算法:传统与改进的路径规划仿真研究

    探索与Cursor协作创建一个完整的前后端分离的项目的最佳实践,提示词指南

    项目开发所用的主要提示词模板

    基于OpenVINO.NET实现的人脸检测。.zip

    项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行;功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用

    电力系统暂态稳定性仿真分析:Matlab编程与Simulink模型下的各类故障影响研究,电力系统暂态稳定性仿真分析:Matlab编程与Simulink模型下的各类故障影响研究,电力系统暂态稳定性Mat

    电力系统暂态稳定性仿真分析:Matlab编程与Simulink模型下的各类故障影响研究,电力系统暂态稳定性仿真分析:Matlab编程与Simulink模型下的各类故障影响研究,电力系统暂态稳定性Matlab编程 Simulink仿真 单机无穷大系统发生各类(三相短路,单相接地,两相接地,两相相间短路)等短路故障,各类(单相断线,两相断线,三相断线)等断线故障,暂态稳定仿真分析 Simulink搭建电力系统暂态仿真模型 通过仿真,观察串联电抗器,并联补偿器,自动重合闸,以及故障切除快慢对暂态稳定性的影响 ,电力系统暂态稳定性; Matlab编程; Simulink仿真; 短路故障; 断线故障; 暂态稳定仿真分析; 仿真模型搭建; 电抗器影响; 补偿器影响; 自动重合闸; 故障切除时间。,Matlab编程与Simulink仿真在电力系统暂态稳定性分析中的应用

Global site tag (gtag.js) - Google Analytics