POI 读取excel

POI 读取excel,第1张

直接上源码:

package edusjtuerplabpoi;

import javaioFileInputStream;

import javaioFileNotFoundException;

import javaioIOException;

import javaioInputStream;

import javatextSimpleDateFormat;

import javautilDate;

import javautilHashMap;

import javautilMap;

import orgapachepoihssfusermodelHSSFCell;

import orgapachepoihssfusermodelHSSFDateUtil;

import orgapachepoihssfusermodelHSSFRow;

import orgapachepoihssfusermodelHSSFSheet;

import orgapachepoihssfusermodelHSSFWorkbook;

import orgapachepoipoifsfilesystemPOIFSFileSystem;

/

*** 作Excel表格的功能类

/

public class ExcelReader {

private POIFSFileSystem fs;

private HSSFWorkbook wb;

private HSSFSheet sheet;

private HSSFRow row;

/

读取Excel表格表头的内容

@param InputStream

@return String 表头内容的数组

/

public String[] readExcelTitle(InputStream is) {

try {

fs = new POIFSFileSystem(is);

wb = new HSSFWorkbook(fs);

} catch (IOException e) {

eprintStackTrace();

}

sheet = wbgetSheetAt(0);

row = sheetgetRow(0);

// 标题总列数

int colNum = rowgetPhysicalNumberOfCells();

Systemoutprintln("colNum:" + colNum);

String[] title = new String[colNum];

for (int i = 0; i < colNum; i++) {

//title[i] = getStringCellValue(rowgetCell((short) i));

title[i] = getCellFormatValue(rowgetCell((short) i));

}

return title;

}

/

读取Excel数据内容

@param InputStream

@return Map 包含单元格数据内容的Map对象

/

public Map<Integer, String> readExcelContent(InputStream is) {

Map<Integer, String> content = new HashMap<Integer, String>();

String str = "";

try {

fs = new POIFSFileSystem(is);

wb = new HSSFWorkbook(fs);

} catch (IOException e) {

eprintStackTrace();

}

sheet = wbgetSheetAt(0);

// 得到总行数

int rowNum = sheetgetLastRowNum();

row = sheetgetRow(0);

int colNum = rowgetPhysicalNumberOfCells();

// 正文内容应该从第二行开始,第一行为表头的标题

for (int i = 1; i <= rowNum; i++) {

row = sheetgetRow(i);

int j = 0;

while (j < colNum) {

// 每个单元格的数据内容用"-"分割开,以后需要时用String类的replace()方法还原数据

// 也可以将每个单元格的数据设置到一个javabean的属性中,此时需要新建一个javabean

// str += getStringCellValue(rowgetCell((short) j))trim() +

// "-";

str += getCellFormatValue(rowgetCell((short) j))trim() + " ";

j++;

}

contentput(i, str);

str = "";

}

return content;

}

/

获取单元格数据内容为字符串类型的数据

@param cell Excel单元格

@return String 单元格数据内容

/

private String getStringCellValue(HSSFCell cell) {

String strCell = "";

switch (cellgetCellType()) {

case HSSFCellCELL_TYPE_STRING:

strCell = cellgetStringCellValue();

break;

case HSSFCellCELL_TYPE_NUMERIC:

strCell = StringvalueOf(cellgetNumericCellValue());

break;

case HSSFCellCELL_TYPE_BOOLEAN:

strCell = StringvalueOf(cellgetBooleanCellValue());

break;

case HSSFCellCELL_TYPE_BLANK:

strCell = "";

break;

default:

strCell = "";

break;

}

if (strCellequals("") || strCell == null) {

return "";

}

if (cell == null) {

return "";

}

return strCell;

}

/

获取单元格数据内容为日期类型的数据

@param cell

Excel单元格

@return String 单元格数据内容

/

private String getDateCellValue(HSSFCell cell) {

String result = "";

try {

int cellType = cellgetCellType();

if (cellType == HSSFCellCELL_TYPE_NUMERIC) {

Date date = cellgetDateCellValue();

result = (dategetYear() + 1900) + "-" + (dategetMonth() + 1)

+ "-" + dategetDate();

} else if (cellType == HSSFCellCELL_TYPE_STRING) {

String date = getStringCellValue(cell);

result = datereplaceAll("[年月]", "-")replace("日", "")trim();

} else if (cellType == HSSFCellCELL_TYPE_BLANK) {

result = "";

}

} catch (Exception e) {

Systemoutprintln("日期格式不正确!");

eprintStackTrace();

}

return result;

}

/

根据HSSFCell类型设置数据

@param cell

@return

/

private String getCellFormatValue(HSSFCell cell) {

String cellvalue = "";

if (cell != null) {

// 判断当前Cell的Type

switch (cellgetCellType()) {

// 如果当前Cell的Type为NUMERIC

case HSSFCellCELL_TYPE_NUMERIC:

case HSSFCellCELL_TYPE_FORMULA: {

// 判断当前的cell是否为Date

if (HSSFDateUtilisCellDateFormatted(cell)) {

// 如果是Date类型则,转化为Data格式

//方法1:这样子的data格式是带时分秒的:2011-10-12 0:00:00

//cellvalue = cellgetDateCellValue()toLocaleString();

//方法2:这样子的data格式是不带带时分秒的:2011-10-12

Date date = cellgetDateCellValue();

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

cellvalue = sdfformat(date);

}

// 如果是纯数字

else {

// 取得当前Cell的数值

cellvalue = StringvalueOf(cellgetNumericCellValue());

}

break;

}

// 如果当前Cell的Type为STRIN

case HSSFCellCELL_TYPE_STRING:

// 取得当前的Cell字符串

cellvalue = cellgetRichStringCellValue()getString();

break;

// 默认的Cell值

default:

cellvalue = " ";

}

} else {

cellvalue = "";

}

return cellvalue;

}

public static void main(String[] args) {

try {

// 对读取Excel表格标题测试

InputStream is = new FileInputStream("d:\\test2xls");

ExcelReader excelReader = new ExcelReader();

String[] title = excelReaderreadExcelTitle(is);

Systemoutprintln("获得Excel表格的标题:");

for (String s : title) {

Systemoutprint(s + " ");

}

// 对读取Excel表格内容测试

InputStream is2 = new FileInputStream("d:\\test2xls");

Map<Integer, String> map = excelReaderreadExcelContent(is2);

Systemoutprintln("获得Excel表格的内容:");

for (int i = 1; i <= mapsize(); i++) {

Systemoutprintln(mapget(i));

}

} catch (FileNotFoundException e) {

Systemoutprintln("未找到指定路径的文件!");

eprintStackTrace();

}

}

}

给表格指定宽度,然后在样式里面设置文本内容自动换行

stylesetWrapText(true);

关于一行拆分几行,什么意思?那不就是把几行合并成一行么,单元格的合并?

这样可以么?

getSheetAt和getsheet参数不一样, getSheetAt 的参数应该是索引, 引用第几个sheet; getSheet的参数应该是sheet的名称,  获取具体名称的sheet。

Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。

Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。

import javaio;

import javatextSimpleDateFormat;

import javautil;

import javasql;

import javautilDate;

import javautilHashMap;

import javautilMap;

import jxl;

public class SimUpdate {

private String fileName;

public ZfzSimUpdate(String fileName){

thisfileName = fileName;

}

static Map tNames;

static{

tNames = new HashMap();

}

/

用于产生 数据库的 ID 值,组成 [年月日时分秒(100-999)] 总共 17 位数

根据不同的表名,可保证同一秒内产生的 ID 号不重复

/

private static String getDtime() {

String rid;

Date nd = new Date();

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");

rid = sdfformat(nd);

return rid;

}

public String getSeqNumber(String tableName) {

if(tableName == null || ""equals(tableName))

tableName = "GENERY";

Integer it;

// noinspection SynchronizeOnNonFinalField

synchronized(tNames){

it = (Integer)tNamesget(tableName);

if(it == null){

it = new Integer(100);

tNamesput(tableName, it);

}else{

if(itintValue() > 998)

it = new Integer(100);

else

it = new Integer(1 + itintValue());

tNamesput(tableName, it);

}

}

return getDtime() + StringvalueOf(it);

}

private void updateDb(){

try{

Connection conn = DbPoolconnectDB();

if(conn != null){

Statement stmt = conncreateStatement();

//

jxlWorkbook rwb = null;

try{

//构建Workbook对象 只读Workbook对象

//直接从本地文件创建Workbook

//从输入流创建Workbook

InputStream is = new FileInputStream(fileName);

rwb = WorkbookgetWorkbook(is);

//Sheet(术语:工作表)就是Excel表格左下角的Sheet1,Sheet2,Sheet3但在程序中

//Sheet的下标是从0开始的

//获取第一张Sheet表

Sheet rs = rwbgetSheet(0);

//获取Sheet表中所包含的总列数

int rsColumns = rsgetColumns();

//获取Sheet表中所包含的总行数

int rsRows = rsgetRows();

//获取指这下单元格的对象引用

String simNumber = "",termSeqId = "";

//指定SIM卡号及序列号

for(int i=0;i<rsRows;i++){

for(int j=0;j<rsColumns;j++){

Cell cell = rsgetCell(j,i);

if(j==0){

simNumber = cellgetContents();

}

termSeqId = "633"+simNumber;

}

String sql = "查询SQL";

int isOk = stmtexecuteUpdate(sql);

if(isOk == 0 && !simNumberequals("")){

String termId = getSeqNumber("termInf");

String insertSql = "自定义INSERT";

int isAdd = stmtexecuteUpdate(insertSql);

if(isAdd > 0){

Systemoutprintln("成功插入第"+i+"条数据");

}

}

//Systemoutprintln("SIM卡号:"+simNumber+",序列号:"+termSeqId);

}

//以下代码为写入新的EXCEL,这里不使用,所以注释

/

//利用已经创建的Excel工作薄创建新的可写入的Excel工作薄

jxlwriteWritableWorkbook wwb = WorkbookcreateWorkbook(new File("D://Book2xls"),rwb);

//读取第一张工作表

jxlwriteWritableSheet ws = wwbgetSheet(0);

//获取第一个单元格对象

jxlwriteWritableCell wc = wsgetWritableCell(0, 0);

//决断单元格的类型,做出相应的转化

if (wcgetType() == CellTypeLABEL) {

Label l = (Label) wc;

lsetString("The value has been modified");

}

//写入Excel对象

wwbwrite();

wwbclose();

/

}catch(Exception e){

eprintStackTrace();

}

finally{

// *** 作完成时,关闭对象,翻译占用的内存空间

rwbclose();

}

//

}

}catch(Exception e){

eprintStackTrace();

}

}

public static void main(String args[]){

DbPool dbPool = new DbPool("dbConncfg");//连接数据库

SimUpdate simUpdate = new SimUpdate("zfz_simxls");

simUpdateupdateDb();

}

}

如果你使用的是POI那么就是下面的方法

//根据传过来的文件名创建workbook

HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream(file));

//获得excel文件的sheet数量

int sn = wbgetNumberOfSheets();

//依次处理sheet表单

for (int i = 0; i < sn; i++) {

HSSFSheet sheet = wbgetSheetAt(i);

//获得第i张表单的所有行数

for (int j = 0; j < sheetgetLastRowNum(); j++) {

//获得第j行

HSSFRow row = sheetgetRow(j);

//获得该行的cell数量

for (int k = 0; k < rowgetLastCellNum(); k++) {

//☆☆根据cell号获得cell的所有属性☆☆

HSSFCell cell = rowgetCell((short) k);

//然后你就得到值啦

Systemoutprintln(cellgetRichStringCellValue());

当然也可以通过匹配值得到地址

我给你一个我的例子吧:

import javaio;

import javatextSimpleDateFormat;

import javautil;

import javasql;

import javautilDate;

import javautilHashMap;

import javautilMap;

import jxl;

public class SimUpdate {

private String fileName;

public SimUpdate(String fileName){

thisfileName = fileName;

}

static Map tNames;

static{

tNames = new HashMap();

}

//下面是主要代码

private void updateDb(){

try{

Connection conn = DbPoolconnectDB();

if(conn != null){

Statement stmt = conncreateStatement();

//

jxlWorkbook rwb = null;

try{

//构建Workbook对象 只读Workbook对象

//直接从本地文件创建Workbook

//从输入流创建Workbook

InputStream is = new FileInputStream(fileName);

rwb = WorkbookgetWorkbook(is);

//Sheet(术语:工作表)就是Excel表格左下角的Sheet1,Sheet2,Sheet3但在程序中

//Sheet的下标是从0开始的

//获取第一张Sheet表

Sheet rs = rwbgetSheet(0);

//获取Sheet表中所包含的总列数

int rsColumns = rsgetColumns();

//获取Sheet表中所包含的总行数

int rsRows = rsgetRows();

//获取指这下单元格的对象引用

String simNumber = "",termSeqId = "";

//指定SIM卡号及序列号

for(int i=0;i<rsRows;i++){

for(int j=0;j<rsColumns;j++){

Cell cell = rsgetCell(j,i);

if(j==0){

simNumber = cellgetContents();//这里是猎取你要的参数,和下面一样

}

if(j == 1){

termSeqId = cellgetContents();

}

}

String sql = "update ";//SQL语句

int isOk = stmtexecuteUpdate(sql);

if(isOk == 0){

String insertSql = "insert";//SQL语句

int isAdd = stmtexecuteUpdate(insertSql);

if(isAdd > 0){

Systemoutprintln("成功插入第"+i+"条数据");

}

}

}

//以下代码为写入新的EXCEL,这里不使用,所以注释

/

//利用已经创建的Excel工作薄创建新的可写入的Excel工作薄

jxlwriteWritableWorkbook wwb = WorkbookcreateWorkbook(new File("D://Book2xls"),rwb);

//读取第一张工作表

jxlwriteWritableSheet ws = wwbgetSheet(0);

//获取第一个单元格对象

jxlwriteWritableCell wc = wsgetWritableCell(0, 0);

//决断单元格的类型,做出相应的转化

if (wcgetType() == CellTypeLABEL) {

Label l = (Label) wc;

lsetString("The value has been modified");

}

//写入Excel对象

wwbwrite();

wwbclose();

/

}catch(Exception e){

eprintStackTrace();

}

finally{

// *** 作完成时,关闭对象,翻译占用的内存空间

rwbclose();

}

//

}

}catch(Exception e){

eprintStackTrace();

}

}

}

以上就是关于POI 读取excel全部的内容,包括:POI 读取excel、poi *** 作excel表格、java 的poi里面的getSheetAt和getsheet有什么区别等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9765902.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存