poi excel转txt 支持公式(函数)取值后转换

package cn.com.agree.poi.server.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellValue;
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.xssf.usermodel.XSSFFormulaEvaluator;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class POIExcelUtil
{
//总行数
private int totalRows = 0;

//总列数
private int totalCells = 0;

//构造方法
public POIExcelUtil() {

}

/**
*
* Description:[根据文件名读取excel文件]</li>
* Created by [Huyvanpull] [Jan 20, 2010]</li>
* Midified by [modifier] [modified time]</li>
* @param fileName
* @return
* @throws Exception
*/
public List<ArrayList<String>> read(String fileName)
{
List<ArrayList<String>> dataLst = new ArrayList<ArrayList<String>>();

//检查文件名是否为空或者是否是Excel格式的文件
if (fileName == null || !fileName.matches("^.+\\.(?i)((xls)|(xlsx))$"))
{
System.out.println("非excel文档不能转换");
throw new RuntimeException("非excel文档不能转换");
}

boolean isExcel2003 = true;
// 对文件的合法性进行验证
if (fileName.matches("^.+\\.(?i)(xlsx)$"))
{
isExcel2003 = false;
}

//检查文件是否存在
File file = new File(fileName);
if (file == null || !file.exists())
{
return dataLst;
}

try
{
//调用本类提供的根据流读取的方法
dataLst = read(new FileInputStream(file), isExcel2003);
}
catch (Exception ex)
{
// ex.printStackTrace();
throw new RuntimeException(ex.getMessage());
}

//返回最后读取的结果
return dataLst;
}

/**
* <ul>
* <li>Description:[根据流读取Excel文件]</li>
* <li>Created by [Huyvanpull] [Jan 20, 2010]</li>
* <li>Midified by [modifier] [modified time]</li>
* <ul>
*
* @param inputStream
* @param isExcel2003
* @return
*/
public List<ArrayList<String>> read(InputStream inputStream,
boolean isExcel2003)
{
List<ArrayList<String>> dataLst = null;
try
{
//根据版本选择创建Workbook的方式
Workbook wb = isExcel2003 ? new HSSFWorkbook(inputStream)
: new XSSFWorkbook(inputStream);
dataLst = read(wb);
}
catch (Exception e)
{
// e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
return dataLst;
}

/**
* <ul>
* <li>Description:[得到总行数]</li>
* <li>Created by [Huyvanpull] [Jan 20, 2010]</li>
* <li>Midified by [modifier] [modified time]</li>
* <ul>
*
* @return
*/
public int getTotalRows()
{
return totalRows;
}

/**
* <ul>
* <li>Description:[得到总列数]</li>
* <li>Created by [Huyvanpull] [Jan 20, 2010]</li>
* <li>Midified by [modifier] [modified time]</li>
* <ul>
*
* @return
*/
public int getTotalCells()
{
return totalCells;
}

/**
* <ul>
* <li>Description:[读取数据]</li>
* <li>Created by [Huyvanpull] [Jan 20, 2010]</li>
* <li>Midified by [modifier] [modified time]</li>
* <ul>
*
* @param wb
* @return
*/
private List<ArrayList<String>> read(Workbook wb)
{
List<ArrayList<String>> dataLst = new ArrayList<ArrayList<String>>();

//得到第一个shell
Sheet sheet = wb.getSheetAt(0);
this.totalRows = sheet.getPhysicalNumberOfRows();
this.totalCells = 0;
for (int r = 0; r < this.totalRows; r++)
{
Row row = sheet.getRow(r);
if (row == null)
{
continue;
}
if(row.getLastCellNum()>this.totalCells)
this.totalCells = row.getLastCellNum();
}

//循环Excel的行 */
for (int r = 0; r < this.totalRows; r++)
{
Row row = sheet.getRow(r);
if (row == null)
{
continue;
}

ArrayList<String> rowLst = new ArrayList<String>();
//循环Excel的列
for (short c = 0; c < this.getTotalCells(); c++)
{

Cell cell = row.getCell(c);
String cellValue = "";
if (cell == null)
{
rowLst.add(cellValue);
continue;
}

//处理数字型的,自动去零 */
if (Cell.CELL_TYPE_NUMERIC == cell.getCellType())
{
//在excel里,日期也是数字,在此要进行判断 */
if (HSSFDateUtil.isCellDateFormatted(cell))
{
Date date = cell.getDateCellValue();
cellValue = (date.getYear() + 1900) + "-" + (date.getMonth() + 1)
+ "-" + date.getDate()+" "+date.getHours()+":"+date.getMinutes()+":"+date.getSeconds() ;
}
else
{
cellValue = getRightStr(cell.getNumericCellValue() + "");
}
}
//处理字符串型 */
else if (Cell.CELL_TYPE_STRING == cell.getCellType())
{
cellValue = cell.getStringCellValue();
}
//处理布尔型 */
else if (Cell.CELL_TYPE_BOOLEAN == cell.getCellType())
{
cellValue = cell.getBooleanCellValue() + "";
}
else if (Cell.CELL_TYPE_FORMULA == cell.getCellType())
{
if(wb instanceof HSSFWorkbook) {
HSSFFormulaEvaluator hss = new HSSFFormulaEvaluator((HSSFWorkbook) wb);
try {
cellValue = hss.evaluate(cell).getNumberValue()+"";
} catch(Exception e) {
cellValue = hss.evaluate(cell).getStringValue()+"";
}
} else if(wb instanceof XSSFWorkbook){
XSSFFormulaEvaluator xss = new XSSFFormulaEvaluator((XSSFWorkbook) wb);
try {
cellValue = xss.evaluate(cell).getNumberValue()+"";
} catch(Exception e) {
cellValue = xss.evaluate(cell).getStringValue()+"";
}
}
}
//其它的,非以上几种数据类型 */
else
{
cellValue = cell.toString() + "";
}

rowLst.add(cellValue);
}
dataLst.add(rowLst);
}
return dataLst;
}

/**
* <ul>
* <li>Description:[正确地处理整数后自动加零的情况]</li>
* <li>Created by [Huyvanpull] [Jan 20, 2010]</li>
* <li>Midified by [modifier] [modified time]</li>
* <ul>
*
* @param sNum
* @return
*/
private String getRightStr(String sNum)
{
DecimalFormat decimalFormat = new DecimalFormat("#.00");
String resultStr = decimalFormat.format(new Double(sNum));
if (resultStr.matches("^[-+]?\\d+\\.[0]+$"))
{
resultStr = resultStr.substring(0, resultStr.indexOf("."));
}
return resultStr;
}

/**
* <ul>
* <li>Description:[测试main方法]</li>
* <li>Created by [Huyvanpull] [Jan 20, 2010]</li>
* <li>Midified by [modifier] [modified time]</li>
* <ul>
*
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception
{

// String s = "";
// List<ArrayList<String>> dataLst = new POIExcelUtil()
// .read("E:\\test.xls");
// FileOutputStream fos = new FileOutputStream("c:\\d.txt");
// for (ArrayList<String> innerLst : dataLst)
// {
// StringBuffer rowData = new StringBuffer();
// for (String dataStr : innerLst)
// {
// rowData.append("\t").append(dataStr);
// }
// if (rowData.length() > 0)
// {
//// System.out.println(rowData.deleteCharAt(0).toString());
//// writ2Txt(rowData.deleteCharAt(0).toString()+"\r",fos);
// s = rowData.deleteCharAt(0).toString()+"\r\n";
// System.out.print(s);
// fos.write(s.getBytes());
// }
// }
// fos.close();
// System.out.println("OK");
}
/**
* 数据写入txt文档
* @throws IOException
*/
public static void writ2Txt(String s,FileOutputStream fos) throws IOException{
try {
fos.write(s.getBytes());
} catch (Exception e) {
e.printStackTrace();
}
}

}

时间: 2024-10-09 13:22:35

poi excel转txt 支持公式(函数)取值后转换的相关文章

php二维数组的取值与转换

1 while(list($key,$value) = each($arr)) 2 { 3 while(list($k,$v) = each($value)) 4 { 5 echo $key."==>".$k."===>".$v."<br>"; 6 } 7 } 1 $msg = array( 2 array( 3 'id'=>'45s', 4 'name'=>'jacks' 5 ), 6 array( 7 'i

jQuery的函数取值与赋值

jQuery的函数,都有两个功能,取值与赋值    1.html()        若参数不为空,则先清空匹配元素的内容,然后调用append()插入内容.        若为空,则返回第一个匹配的元素的hmtl源码    2.extend() 用于扩展

Jsonobject 类getInteger函数取值异常

产品实验局环境同事发现分布图与实际业务对不上,因为页面展示流量较大的RTSP,客户并没有相关APP业务.起初以为是前端业务逻辑出问题了: 查看前端数据库查询代码,逻辑十分简单,从数据库中获取app字段的值,然后对应app字典,前端展示: APP_DICT = get_app_dict() result = {"list": {}} if len(data) != 0: for i in range(len(data)): if data[i][1] in APP_DICT: resul

用JQUERY为INPUT的TXT类型赋值及取值操作

注意和纯JS操作的区别,一个是对象,一个是字串,如下说明: 在Jquery中,用$("#id")来获得页面的input元素,其相当于document.getElementById("element")但是,该获取的是一个Jquery对象,而不是一个dom element对象.value是dom element对象的属性.所以,使用$("#id").value不能取到值取值的方法如下: var job_name = $("#id_jenk

Java 中日期的几种常见操作 —— 取值、转换、加减、比较

Java 的开发过程中免不了与 Date 类型纠缠,准备总结一下项目经常使用的日期相关操作,JDK 版本 1.7,如果能够帮助大家节约那么几分钟起身活动一下,去泡杯咖啡,便是极好的,嘿嘿.当然,我只提供了可行的解决方案,并不保证是最佳实践,欢迎讨论. 1. 日期取值 在旧版本 JDK 的时代,有不少代码中日期取值利用了 java.util.Date 类,但是由于 Date 类不便于实现国际化,其实从 JDK1.1 开始,就更推荐使用 java.util.Calendar 类进行时间和日期方面的处

POI/Excel/HTML单元格公式问题

一.问题描述 使用MyBatis从数据库中获取数据,然后用POI把数据填充到Excel模板中,生成最终的xls文件.把最终的xls文件转换为html文件,并返回给前台显示在Panel中. Excel模板中,除了数据点位符外,还有一些计算公式.由于这些计算公式引用的数据在模板中是点位符,所以计算单元显示为"#VALUE!".见下图: 生成Excel文件,在添加了重算的相关代码(见下文)后,计算单元格的值能够正常显示.转换为html后,这些计算单元格不会重新计算,仍然显示为"#V

CSS的函数取值attr()

attr()的定义和用法:插入元素的属性值. 在CSS2.1中attr()总是返回一个字符串.在CSS3中attr()可以返回多种不同的类型.浏览器支持:IE浏览器支持此属性.谷歌浏览器支持此属性.火狐浏览器支持此属性.特别说明:1.IE7和IE7以下的浏览器不支持此属性.2.CSS3的atrr()现在暂无浏览器支持.实例代码: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> &

[转]用NPOI操作EXCEL--通过NPOI获得公式的返回值

本文转自:http://www.cnblogs.com/atao/archive/2009/10/12/1582085.html 前面我们学习了通过NPOI向Excel中设置公式,那么有些读者可能会问:“NPOI能不能获取公式的返回值呢?”,答案是可以! 一.获取模板文件中公式的返回值 如在D盘中有一个名为text.xls的Excel文件,其内容如下: 注意C1单元格中设置的是公式“$A1*$B1”,而不是值“12”.利用NPOI,只需要写简单的几句代码就可以取得此公式的返回值: HSSFWor

2.3.9 用NPOI操作EXCEL--通过NPOI获得公式的返回值

前面我们学习了通过NPOI向Excel中设置公式,那么有些读者可能会问:“NPOI能不能获取公式的返回值呢?”,答案是可以!一.获取模板文件中公式的返回值如在D盘中有一个名为text.xls的Excel文件,其内容如下: 注意C1单元格中设置的是公式“$A1*$B1”,而不是值“12”.利用NPOI,只需要写简单的几句代码就可以取得此公式的返回值: HSSFWorkbook wb = new HSSFWorkbook(new FileStream("d:/test.xls",FileM