
POI是Apache下的一个项目,是用Java编写的开源框架,提供API供开发者直接 *** 作Microsoft Office(Excel,Word,PowerPoint)
POI为我们带来了什么
在很多的企业当中,储蓄数据是使用Excel文档的,因为Excel文档的格式方便,也能套用公式,而企业程序是存储在数据库当中,这样就需要一种两者之间互相转换的方法,当企业刚开始使用信息化的管理系统时,也需要将Excel的数据录入到程序当中,这种需求是非常普遍的
POI使用:
首先增加Maven的依赖
<!-- POI核心依赖 -->
<dependency>
<groupId>orgapachepoi</groupId>
<artifactId>poi</artifactId>
<version>38</version>
</dependency>
<!-- 为POI支持Office Open XML -->
<dependency>
<groupId>orgapachepoi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>38</version>
</dependency>
<dependency>
<groupId>orgapachepoi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>38</version>
</dependency>
<!-- 支持Word文档的 *** 作 -->
<dependency>
<groupId>orgapachepoi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>38</version>
</dependency>
以下为 *** 作Excel的测试类
package comaccentrixray;
import javaioFile;
import javaioFileOutputStream;
import javaioIOException;
import orgapachepoiopenxml4jexceptionsInvalidFormatException;
import orgapachepoissusermodelCell;
import orgapachepoissusermodelCellStyle;
import orgapachepoissusermodelRow;
import orgapachepoissusermodelSheet;
import orgapachepoissusermodelWorkbook;
import orgapachepoissusermodelWorkbookFactory;
import orgapachepoixssfusermodelXSSFWorkbook;
import orgjunitBefore;
import orgjunitTest;
public class TestExcel {
private Workbook workbook;
/
由于Excel当中的单元格Cell存在类型,若获取类型错误 就会产生错误,
所以通过此方法将Cell内容全部转换为String类型
/
private String getCellValue(Cell cell) {
String str = null;
switch (cellgetCellType()) {
case CellCELL_TYPE_BLANK:
str = "";
break;
case CellCELL_TYPE_BOOLEAN:
str = StringvalueOf(cellgetBooleanCellValue());
break;
case CellCELL_TYPE_FORMULA:
str = StringvalueOf(cellgetCellFormula());
break;
case CellCELL_TYPE_NUMERIC:
str = StringvalueOf(cellgetNumericCellValue());
break;
case CellCELL_TYPE_STRING:
str = StringvalueOf(cellgetStringCellValue());
break;
default:
str = null;
break;
}
return str;
}
@Before
public void setUp() throws InvalidFormatException, IOException {
// 加载excel文件,自动判断是HSSF还是XSSF
workbook = WorkbookFactorycreate(new File("E:/aaaxls"));
}
/
读取一个已存在的Excel
/
@Test
public void testReadExcel() throws InvalidFormatException, IOException {
// 获取第一个工作目录,下标从0开始
Sheet sheet = workbookgetSheetAt(0);
// 获取该工作目录最后一行的行数
int lastRowNum = sheetgetLastRowNum();
for (int i = 0; i < lastRowNum; i++) {
// 获取下标为i的行
Row row = sheetgetRow(i);
// 获取该行单元格个数
int lastCellNum = rowgetLastCellNum();
for (int j = 0; j < lastCellNum; j++) {
// 获取下标为j的单元格
Cell cell = rowgetCell(j);
// 调用获取方法
String cellValue = thisgetCellValue(cell);
}
}
}
/
使用Foreach方式读取Excel
/
@Test
public void testForeachReadExcel() {
// 根据sheet的名字获取
Sheet sheet = workbookgetSheet("test");
// 处了上面testReadExcel的方式读取以外,还支持foreach的方式读取
for (Row row : sheet) {
for (Cell cell : row) {
String cellValue = thisgetCellValue(cell);
Systemoutprintln(cellValue);
}
}
}
/
创建简单的Excel
/
@Test
public void testWriteExcel() throws IOException {
// 创建一个XSSF的Excel文件
workbook = new XSSFWorkbook();
FileOutputStream fos = new FileOutputStream("E:/testxlsx");
// 创建名称为test的工作目录
Sheet sheet = workbookcreateSheet("test");
/
创建1个10行x10列的工作目录
/
for (int i = 0; i < 10; i++) {
// 创建一行
Row row = sheetcreateRow(i);
for (int j = 0; j < 10; j++) {
// 创建一个单元格
Cell cell = rowcreateCell(j);
// 设置单元格value
cellsetCellValue("test");
// 此处为设置Excel的样式,设置单元格内容居中,
// 但这样设置方式并不常用,请留意下面的方法
CellStyle cs = workbookcreateCellStyle();
cssetAlignment(CellStyleALIGN_CENTER);
cellsetCellStyle(cs);
}
}
// 将Excel写出到文件流
workbookwrite(fos);
}
在2003版本的的doc文件中,POI可以使用HWPF很方便的获取range,然后使用replace方法替换文本框中的内容,不过好像Word背景什么都没有了。在docx中,正常的文本段落还是比较方便替换的,但是遇到文本框中的文
按列读取的方法:
String pathname = "E:\\files\\titlexlsx";
File file = new File(pathname);
InputStream in = new FileInputStream(file);
//得到整个excel对象
XSSFWorkbook excel = new XSSFWorkbook(in);
//获取整个excel有多少个sheet
int sheets = excelgetNumberOfSheets();
//便利第一个sheet
Map<String,String> colMap = new HashMap<String, String>();
for(int i = 0 ; i < sheets ; i++ ){
XSSFSheet sheet = excelgetSheetAt(i);
if(sheet == null){
continue;
}
int mergedRegions = sheetgetNumMergedRegions();
XSSFRow row2 = sheetgetRow(0);
Map<Integer,String> category = new HashMap<Integer, String>();
for(int j = 0 ; j < mergedRegions; j++ ){
CellRangeAddress rangeAddress = sheetgetMergedRegion(j);
int firstRow = rangeAddressgetFirstColumn();
int lastRow = rangeAddressgetLastColumn();
categoryput(rangeAddressgetFirstColumn(), rangeAddressgetLastColumn()+"-"+row2getCell(firstRow)toString());
}
//便利每一行
for( int rowNum = 1 ; rowNum <= sheetgetLastRowNum() ; rowNum++ ){
Systemoutprintln();
XSSFRow row = sheetgetRow(rowNum);
if(row == null){
continue;
}
short lastCellNum = rowgetLastCellNum();
String cate = "";
Integer maxIndex = 0;
for( int col = rowgetFirstCellNum() ; col < lastCellNum ; col++ ){
XSSFCell cell = rowgetCell(col);
if(cell == null ){
continue;
}
if(""equals(celltoString())){
continue;
}
int columnIndex = cellgetColumnIndex();
String string = categoryget(columnIndex);
if(string != null && !stringequals("")){
String[] split = stringsplit("-");
cate = split[1];
maxIndex = IntegerparseInt(split[0]);
Systemoutprintln(cate+"<-->"+celltoString());
}else {
//如果当前便利的列编号小于等于合并单元格的结束,说明分类还是上面的分类名称
if(columnIndex<=maxIndex){
Systemoutprintln(cate+"<-->"+celltoString());
}else {
Systemoutprintln("分类未知"+"<-->"+celltoString());
}
}
}
}
}
}
在保护状态下execl的格式有可能正在被使用,你这边修改,准确说是线程冲突,一般excel值会作为导出文件的模板,是不会编辑的。你可以在读的时候判断execl是否正在被使用。
下面的代码问题,你可以参考
package comhwtglmfcommon;
import javaioIOException;
import javaioOutputStream;
import javautilArrayList;
import javautilList;
import javaxservlet>
以上就是关于急!!!java用poi导出excel文件,打开导出的文件时报错“文件错误,数据可能丢失”全部的内容,包括:急!!!java用poi导出excel文件,打开导出的文件时报错“文件错误,数据可能丢失”、java 使用POI导出Excel文件,打开导出文件时报错、如何用Apache POI *** 作Excel文件等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)