POI读写海量Excel (详细解读)

POI读写海量Excel (详细解读)
POI读写海量Excel (详细解读)

目前处理Excel的开源javaAPI主要有两种,一是Jxl(Java Excel API),Jxl只支持Excel2003以下的版本。另外一种是Apache的Jakarta POI,相比于Jxl,POI对微软办公文档的支持更加强大,但是它使用复杂,上手慢。POI可支持更高的Excel版本2007。对Excel 的读取,POI有两种模式,一是用户模式,这种方式同Jxl的使用很类似,使用简单,都是将文件一次性读到内存,文件小的时候,没有什么问题,当文件大的时候,就会出现OutOfMemory的内存溢出问题。第二种是事件驱动模式,拿Excel2007来说,其内容采用XML的格式来存储,所以处理excel就是解析XML,而目前使用事件驱动模式解析XML 的API是SAX(Simple API for XML),这种模型在读取XML文档时,并没有将整个文档读入内存,而是按顺序将整个文档解析完,在解析过程中,会主动产生事件交给程序中相应的处理函数来处理当前内容。因此这种方式对系统资源要求不高,可以处理海量数据。笔者曾经做过测试,这种方法处理一千万条,每条五列的数据花费大约11分钟。可见处理海量数据的文件事件驱动是一个很好的方式。而本文中用到的AbstractExcel2003Reader、AbstractExcel2007Reader对Excel的读取都是采用这种POI的事件驱动模式。至于Excel 的写操作,对较高版本的Excel2007,POI提供了很好的支持,主要流程是第一步构建工作薄和电子表格对象,第二步在一个流中构建文本文件,第三步使用流中产生的数据替换模板中的电子表格。这种方式也可以处理海量数据文件。AbstractExcel2007Writer就是使用这种方式进行写操作。对于写入较低版本的Excel2003,POI使用了用户模式来处理,就是将整个文档加载进内存,如果数据量大的话就会出现内存溢出的问题,Excel2003Writer就是使用这种方式。据笔者的测试,如果数据量大于3万条,每条8列的话,就会报OutOfMemory 的错误。Excel2003中每个电子表格的记录数必须在65536以下,否则就会发生异常。目前还没有好的解决方案,建议对于海量数据写入操作,尽量使用Excel2007。

/**

* 抽象Excel2003读取器,通过实现HSSFListener监听器,采用事件驱动模式解析excel2003 * 中的内容,遇到特定事件才会触发,大大减少了内存的使用。

*

*/

public class Excel2003Reader implements HSSFListener{

private int minColumns = -1;

private POIFSFileSystem fs;

private int lastRowNumber;

private int lastColumnNumber;

/** Should we output the formula, or the value it has? */

private boolean outputFormulaValues = true;

/** For parsing Formulas */

private SheetRecordCollectingListener workbookBuildingListener;

//excel2003工作薄

private HSSFWorkbook stubWorkbook;

// Records we pick up as we process

private SSTRecord sstRecord;

private FormatTrackingHSSFListener formatListener;

//表索引

private int sheetIndex = -1;

private BoundSheetRecord[] orderedBSRs;

@SuppressWarnings("unchecked")

private ArrayList boundSheetRecords = new ArrayList();

// For handling formulas with string results

private int nextRow;

private int nextColumn;

private boolean outputNextStringRecord;

//当前行

private int curRow = 0;

//存储行记录的容器

private List rowlist = new ArrayList();;

@SuppressWarnings( "unused")

private String sheetName;

private IRowReader rowReader;

public void setRowReader(IRowReader rowReader){

this.rowReader = rowReader;

}

/**

* 遍历excel下所有的sheet

* @throws IOException

*/

public void process(String fileName) throws IOException {

this.fs = new POIFSFileSystem(new FileInputStream(fileName));

MissingRecordAwareHSSFListener listener = new MissingRecordAwareHSSFListener( this);

formatListener = new FormatTrackingHSSFListener(listener);

HSSFEventFactory factory = new HSSFEventFactory();

HSSFRequest request = new HSSFRequest();

if (outputFormulaValues) {

request.addListenerForAllRecords(formatListener);

} else {

workbookBuildingListener = new SheetRecordCollectingListener(

formatListener);

request.addListenerForAllRecords(workbookBuildingListener);

}

factory.processWorkbookEvents(request, fs);

}

/**

* HSSFListener 监听方法,处理Record

*/

@SuppressWarnings("unchecked")

public void processRecord(Record record) {

int thisRow = -1;

int thisColumn = -1;

String thisStr = null;

String value = null;

switch (record.getSid()) {

case BoundSheetRecord.sid:

boundSheetRecords.add(record);

break;

case BOFRecord.sid:

BOFRecord br = (BOFRecord) record;

if (br.getType() == BOFRecord.TYPE_WORKSHEET) {

// 如果有需要,则建立子工作薄

if (workbookBuildingListener != null && stubWorkbook == null) {

stubWorkbook = workbookBuildingListener

.getStubHSSFWorkbook();

}

sheetIndex++;

if (orderedBSRs == null) {

orderedBSRs = BoundSheetRecord

.orderByBofPosition(boundSheetRecords);

}

sheetName = orderedBSRs[sheetIndex].getSheetname();

}

break;

case SSTRecord.sid:

sstRecord = (SSTRecord) record;

break;

case BlankRecord.sid:

BlankRecord brec = (BlankRecord) record;

thisRow = brec.getRow();

thisColumn = brec.getColumn();

thisStr = "";

rowlist.add(thisColumn, thisStr);

break;

case BoolErrRecord.sid: //单元格为布尔类型

BoolErrRecord berec = (BoolErrRecord) record;

thisRow = berec.getRow();

thisColumn = berec.getColumn();

thisStr = berec.getBooleanValue()+"";

rowlist.add(thisColumn, thisStr);

break;

case FormulaRecord.sid: //单元格为公式类型

FormulaRecord frec = (FormulaRecord) record;

thisRow = frec.getRow();

thisColumn = frec.getColumn();

if (outputFormulaValues) {

if (Double.isNaN(frec.getValue())) {

// Formula result is a string

// This is stored in the next record

outputNextStringRecord = true;

nextRow = frec.getRow();

nextColumn = frec.getColumn();

} else {

thisStr = formatListener.formatNumberDateCell(frec);

}

} else {

thisStr = '"' + HSSFFormulaParser.toFormulaString(stubWorkbook,

frec.getParsedExpression()) + '"';

}

rowlist.add(thisColumn,thisStr);

break;

case StringRecord.sid://单元格中公式的字符串

if (outputNextStringRecord) {

// String for formula

StringRecord srec = (StringRecord) record;

thisStr = srec.getString();

thisRow = nextRow;

thisColumn = nextColumn;

outputNextStringRecord = false;

}

break;

case LabelRecord.sid:

LabelRecord lrec = (LabelRecord) record;

curRow = thisRow = lrec.getRow();

thisColumn = lrec.getColumn();

value = lrec.getValue().trim();

value = value.equals("")?" ":value;

this.rowlist.add(thisColumn, value);

break;

case LabelSSTRecord.sid: //单元格为字符串类型

LabelSSTRecord lsrec = (LabelSSTRecord) record;

curRow = thisRow = lsrec.getRow();

thisColumn = lsrec.getColumn();

if (sstRecord == null) {

rowlist.add(thisColumn, " ");

} else {

value = sstRecord

.getString(lsrec.getSSTIndex()).toString().trim();

value = value.equals("")?" ":value;

rowlist.add(thisColumn,value);

}

break;

case NumberRecord.sid: //单元格为数字类型

NumberRecord numrec = (NumberRecord) record;

curRow = thisRow = numrec.getRow();

thisColumn = numrec.getColumn();

value = formatListener.formatNumberDateCell(numrec).trim();

value = value.equals("")?" ":value;

// 向容器加入列值

rowlist.add(thisColumn, value);

break;

default:

break;

}

// 遇到新行的操作

if (thisRow != -1 && thisRow != lastRowNumber) {

lastColumnNumber = -1;

}

// 空值的操作

if (record instanceof MissingCellDummyRecord) {

MissingCellDummyRecord mc = (MissingCellDummyRecord) record;

curRow = thisRow = mc.getRow();

thisColumn = mc.getColumn();

rowlist.add(thisColumn," ");

}

// 更新行和列的值

if (thisRow > -1)

lastRowNumber = thisRow;

if (thisColumn > -1)

lastColumnNumber = thisColumn;

// 行结束时的操作

if (record instanceof LastCellOfRowDummyRecord) {

if (minColumns > 0) {

// 列值重新置空

if (lastColumnNumber == -1) {

lastColumnNumber = 0;

}

}

lastColumnNumber = -1;

// 每行结束时,调用getRows() 方法

rowReader.getRows(sheetIndex,curRow, rowlist);

// 清空容器

rowlist.clear();

}

}

}

/**

* 抽象Excel2007读取器,excel2007的底层数据结构是xml文件,采用SAX的事件驱动的方法解析

* xml,需要继承DefaultHandler,在遇到文件内容时,事件会触发,这种做法可以大大降低

* 内存的耗费,特别使用于大数据量的文件。

*

*/

public class Excel2007Reader extends DefaultHandler {

//共享字符串表

private SharedStringsTable sst;

//上一次的内容

private String lastContents;

private boolean nextIsString;

private int sheetIndex = -1;

private List rowlist = new ArrayList();

//当前行

private int curRow = 0;

//当前列

private int curCol = 0;

//日期标志

private boolean dateFlag;

//数字标志

private boolean numberFlag;

private boolean isTElement;

private IRowReader rowReader;

public void setRowReader(IRowReader rowReader){

this.rowReader = rowReader;

}

/**只遍历一个电子表格,其中sheetId为要遍历的sheet索引,从1开始,1-3 * @param filename

* @param sheetId

* @throws Exception

*/

public void processOneSheet(String filename,int sheetId) throws Exception { OPCPackage pkg = OPCPackage.open(filename);

XSSFReader r = new XSSFReader(pkg);

SharedStringsTable sst = r.getSharedStringsTable();

XMLReader parser = fetchSheetParser(sst);

// 根据rId# 或rSheet# 查找sheet

InputStream sheet2 = r.getSheet("rId"+sheetId);

sheetIndex++;

InputSource sheetSource = new InputSource(sheet2);

parser.parse(sheetSource);

sheet2.close();

}

/**

* 遍历工作簿中所有的电子表格

* @param filename

* @throws Exception

*/

public void process(String filename) throws Exception {

OPCPackage pkg = OPCPackage.open(filename);

XSSFReader r = new XSSFReader(pkg);

SharedStringsTable sst = r.getSharedStringsTable();

XMLReader parser = fetchSheetParser(sst);

Iterator sheets = r.getSheetsData();

while (sheets.hasNext()) {

curRow = 0;

sheetIndex++;

InputStream sheet = sheets.next();

InputSource sheetSource = new InputSource(sheet);

parser.parse(sheetSource);

sheet.close();

}

}

public XMLReader fetchSheetParser(SharedStringsTable sst)

throws SAXException {

XMLReader parser = XMLReaderFactory

.createXMLReader("org.apache.xerces.parsers.SAXParser");

this.sst = sst;

parser.setContentHandler(this);

return parser;

}

public void startElement(String uri, String localName, String name,

Attributes attributes) throws SAXException {

// c => 单元格

if ("c".equals(name)) {

// 如果下一个元素是SST 的索引,则将nextIsString标记为true

String cellType = attributes.getValue("t");

if ("s".equals(cellType)) {

nextIsString = true;

} else {

nextIsString = false;

}

//日期格式

String cellDateType = attributes.getValue("s");

if ("1".equals(cellDateType)){

dateFlag = true;

} else {

dateFlag = false;

}

String cellNumberType = attributes.getValue("s");

if("2".equals(cellNumberType)){

numberFlag = true;

} else {

numberFlag = false;

}

}

//当元素为t时

if("t".equals(name)){

isTElement = true;

} else {

isTElement = false;

}

// 置空

lastContents = "";

}

public void endElement(String uri, String localName, String name)

throws SAXException {

// 根据SST的索引值的到单元格的真正要存储的字符串

// 这时characters()方法可能会被调用多次

if (nextIsString) {

try {

int idx = Integer.parseInt(lastContents);

lastContents = new XSSFRichTextString(sst.getEntryAt(idx))

.toString();

} catch (Exception e) {

}

}

//t元素也包含字符串

if(isTElement){

String value = lastContents.trim();

rowlist.add(curCol, value);

curCol++;

isTElement = false;

// v => 单元格的值,如果单元格是字符串则v标签的值为该字符串在SST中的索引

// 将单元格内容加入rowlist中,在这之前先去掉字符串前后的空白符} else if ("v".equals(name)) {

String value = lastContents.trim();

value = value.equals("")?" ":value;

//日期格式处理

if(dateFlag){

Date date = HSSFDateUtil.getJavaDate(Double.valueOf(value));

SimpleDateFormat dateFormat = new SimpleDateFormat(

"dd/MM/yyyy");

value = dateFormat.format(date);

}

//数字类型处理

if(numberFlag){

BigDecimal bd = new BigDecimal(value);

value = bd.setScale(3,BigDecimal.ROUND_UP).toString();

}

rowlist.add(curCol, value);

curCol++;

}else {

//如果标签名称为row ,这说明已到行尾,调用optRows() 方法

if (name.equals("row")) {

rowReader.getRows(sheetIndex,curRow,rowlist);

rowlist.clear();

curRow++;

curCol = 0;

}

}

}

public void characters(char[] ch, int start, int length)

throws SAXException {

//得到单元格内容的值

lastContents += new String(ch, start, length);

}

}

public class ExcelReaderUtil {

//excel2003扩展名

public static final String EXCEL03_EXTENSION = ".xls";

//excel2007扩展名

public static final String EXCEL07_EXTENSION = ".xlsx";

/**

* 读取Excel文件,可能是03也可能是07版本

* @param excel03

* @param excel07

* @param fileName

* @throws Exception

*/

public static void readExcel(IRowReader reader,String fileName) throws Exception{ // 处理excel2003文件

if (fileName.endsWith(EXCEL03_EXTENSION)){

Excel2003Reader excel03 = new Excel2003Reader();

excel03.setRowReader(reader);

excel03.process(fileName);

// 处理excel2007文件

} else if (fileName.endsWith(EXCEL07_EXTENSION)){

Excel2007Reader excel07 = new Excel2007Reader();

excel07.setRowReader(reader);

excel07.process(fileName);

} else {

throw new Exception("文件格式错误,fileName的扩展名只能是xls或xlsx。");

}

}

}

public interface IRowReader {

/**业务逻辑实现方法

* @param sheetIndex

* @param curRow

* @param rowlist

*/

public void getRows(int sheetIndex,int curRow, List rowlist);

}

public class RowReader implements IRowReader{

/* 业务逻辑实现方法

* @see com.eprosun.util.excel.IRowReader#getRows(int, int, java.util.List)

*/

public void getRows(int sheetIndex, int curRow, List rowlist) {

// TODO Auto-generated method stub

System.out.print(curRow+" ");

for (int i = 0; i < rowlist.size(); i++) {

System.out.print(rowlist.get(i) + " ");

}

System.out.println();

}

}

public class Main {

public static void main(String[] args) throws Exception {

IRowReader reader = new RowReader();

//ExcelReaderUtil.readExcel(reader, "F://te03.xls");

ExcelReaderUtil.readExcel(reader, "F://test07.xlsx");

}

}

public class Excel2003Writer {

/**

* @param args

*/

public static void main(String[] args) {

try{

System.out.println("开始写入excel2003....");

writeExcel("tes2003.xls");

System.out.println("写完xcel2003");

} catch (IOException e) {

}

}

/**

* 写入excel并填充内容,一个sheet只能写65536行以下,超出会报异常,写入时建议使用AbstractExcel2007Writer

* @param fileName

* @throws IOException

*/

public static void writeExcel(String fileName) throws IOException{

// 创建excel2003对象

Workbook wb = new HSSFWorkbook();

// 设置文件放置路径和文件名

FileOutputStream fileOut = new FileOutputStream(fileName);

// 创建新的表单

Sheet sheet = wb.createSheet("newsheet");

// 创建新行

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

Row row = sheet.createRow(i);

// 创建单元格

Cell cell = row.createCell(0);

// 设置单元格值

cell.setCellValue(1);

row.createCell(1).setCellValue(1+i);

row.createCell(2).setCellValue(true);

row.createCell(3).setCellValue(0.43d);

row.createCell(4).setCellValue('d');

row.createCell(5).setCellValue("");

row.createCell(6).setCellValue("第七列"+i);

row.createCell(7).setCellValue("第八列"+i);

}

wb.write(fileOut);

fileOut.close();

}

}

/**

* 抽象excel2007读入器,先构建.xlsx一张模板,改写模板中的sheet.xml,使用这种方法* 写入.xlsx文件,不需要太大的内存

*

*/

public abstract class AbstractExcel2007Writer {

private SpreadsheetWriter sw;

/**

* 写入电子表格的主要流程

* @param fileName

* @throws Exception

*/

public void process(String fileName) throws Exception{

// 建立工作簿和电子表格对象

XSSFWorkbook wb = new XSSFWorkbook();

XSSFSheet sheet = wb.createSheet("sheet1");

// 持有电子表格数据的xml文件名例如/xl/worksheets/sheet1.xml

String sheetRef = sheet.getPackagePart().getPartName().getName();

// 保存模板

FileOutputStream os = new FileOutputStream("template.xlsx");

wb.write(os);

os.close();

// 生成xml文件

File tmp = File.createTempFile("sheet", ".xml");

Writer fw = new FileWriter(tmp);

sw = new SpreadsheetWriter(fw);

generate();

fw.close();

// 使用产生的数据替换模板

File templateFile = new File("template.xlsx");

FileOutputStream out = new FileOutputStream(fileName);

substitute(templateFile, tmp, sheetRef.substring(1), out);

out.close();

//删除文件之前调用一下垃圾回收器,否则无法删除模板文件

System.gc();

// 删除临时模板文件

if (templateFile.isFile()&&templateFile.exists()){

templateFile.delete();

}

}

/**

* 类使用者应该使用此方法进行写操作

* @throws Exception

*/

public abstract void generate() throws Exception;

public void beginSheet() throws IOException {

sw.beginSheet();

}

public void insertRow(int rowNum) throws IOException {

sw.insertRow(rowNum);

}

public void createCell(int columnIndex, String value) throws IOException { sw.createCell(columnIndex, value, -1);

}

public void createCell(int columnIndex, double value) throws IOException { sw.createCell(columnIndex, value, -1);

}

public void endRow() throws IOException {

sw.endRow();

}

public void endSheet() throws IOException {

sw.endSheet();

}

/**

*

* @param zipfile the template file

* @param tmpfile the XML file with the sheet data

* @param entry the name of the sheet entry to substitute, e.g. xl/worksheets/sheet1.xml * @param out the stream to write the result to

*/

private static void substitute(File zipfile, File tmpfile, String entry,

OutputStream out) throws IOException {

ZipFile zip = new ZipFile(zipfile);

ZipOutputStream zos = new ZipOutputStream(out);

@SuppressWarnings("unchecked")

Enumeration en = (Enumeration) zip.entries();

while (en.hasMoreElements()) {

ZipEntry ze = en.nextElement();

if (!ze.getName().equals(entry)) {

zos.putNextEntry(new ZipEntry(ze.getName()));

InputStream is = zip.getInputStream(ze);

copyStream(is, zos);

is.close();

}

}

zos.putNextEntry(new ZipEntry(entry));

InputStream is = new FileInputStream(tmpfile);

copyStream(is, zos);

is.close();

zos.close();

}

private static void copyStream(InputStream in, OutputStream out)

throws IOException {

byte[] chunk = new byte[1024];

int count;

while ((count = in.read(chunk)) >= 0) {

out.write(chunk, 0, count);

}

}

/**

* 在写入器中写入电子表格

*

*/

public static class SpreadsheetWriter {

private final Writer _out;

private int _rownum;

private static String LINE_SEPARATOR = System.getProperty("line.separator");

public SpreadsheetWriter(Writer out) {

_out = out;

}

public void beginSheet() throws IOException {

_out.write(""

+ "");

_out.write(""+LINE_SEPARATOR);

}

public void endSheet() throws IOException {

_out.write("");

_out.write("");

}

/**

* 插入新行

*

* @param rownum 以0开始

*/

public void insertRow(int rownum) throws IOException {

_out.write(""+LINE_SEPARATOR);

this._rownum = rownum;

}

/**

* 插入行结束标志

*/

public void endRow() throws IOException {

_out.write(""+LINE_SEPARATOR);

}

/**

* 插入新列

* @param columnIndex

* @param value

* @param styleIndex

* @throws IOException

*/

public void createCell(int columnIndex, String value, int styleIndex) throws IOException {

String ref = new CellReference(_rownum, columnIndex)

.formatAsString();

_out.write("

if (styleIndex != -1)

_out.write(" s=\"" + styleIndex + "\"");

_out.write(">");

_out.write(""+XMLEncoder.encode(value)+"");

_out.write("");

}

public void createCell(int columnIndex, String value)

throws IOException {

createCell(columnIndex, value, -1);

}

public void createCell(int columnIndex, double value, int styleIndex) throws IOException {

String ref = new CellReference(_rownum, columnIndex)

.formatAsString();

_out.write("

if (styleIndex != -1)

_out.write(" s=\"" + styleIndex + "\"");

_out.write(">");

_out.write("" + value + "");

_out.write("");

}

public void createCell(int columnIndex, double value)

throws IOException {

createCell(columnIndex, value, -1);

}

public void createCell(int columnIndex, Calendar value, int styleIndex) throws IOException {

createCell(columnIndex, DateUtil.getExcelDate(value, false),

styleIndex);

}

}

}

public class Excel2007WriterImpl extends AbstractExcel2007Writer{

/**

* @param args

* @throws Exception

*/

public static void main(String[] args) throws Exception {

// TODO Auto-generated method stub

System.out.println("............................");

long start = System.currentTimeMillis();

//构建excel2007写入器

AbstractExcel2007Writer excel07Writer = new Excel2007WriterImpl();

//调用处理方法

excel07Writer.process("F://test07.xlsx");

long end = System.currentTimeMillis();

System.out.println("....................."+(end-start)/1000);

}

/*

* 可根据需求重写此方法,对于单元格的小数或者日期格式,会出现精度问题或者日期格式转化问题,建议使用字符串插入方法

* @see com.excel.ver2.AbstractExcel2007Writer#generate()

*/

@Override

public void generate()throws Exception {

//电子表格开始

beginSheet();

for (int rownum = 0; rownum < 100; rownum++) {

//插入新行

insertRow(rownum);

//建立新单元格,索引值从0开始,表示第一列

createCell(0, "中国<" + rownum + "!");

createCell(1, 34343.123456789);

createCell(2, "23.67%");

createCell(3, "12:12:23");

createCell(4, "2010-10-11 12:12:23");

createCell(5, "true");

createCell(6, "false");

endRow();

}

//电子表格结束

endSheet();

}

}

public class XMLEncoder {

private static final String[] xmlCode = new String[256];

static {

// Special characters

xmlCode['\''] = "'";

xmlCode['\"'] = """; // double quote

xmlCode['&'] = "&"; // ampersand

xmlCode['<'] = "<"; // lower than

xmlCode['>'] = ">"; // greater than

}

/**

*

* Encode the given text into xml.

*

*

* @param string the text to encode

* @return the encoded string

*/

public static String encode(String string) {

if (string == null) return "";

int n = string.length();

char character;

String xmlchar;

StringBuffer buffer = new StringBuffer();

// loop over all the characters of the String.

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

character = string.charAt(i);

// the xmlcode of these characters are added to a StringBuffer one by one

try {

xmlchar = xmlCode[character];

if (xmlchar == null) {

buffer.append(character);

buffer.append(xmlCode[character]);

}

} catch (ArrayIndexOutOfBoundsException aioobe) {

buffer.append(character);

}

}

return buffer.toString();

}

}

可以参见转载文章:https://www.360docs.net/doc/5d4376244.html,/goodkuang2012/article/details/7350985

使用POI来处理Excel和Word文件格式

// 文件二进制输入流 private InputStream is = null; // 当前的Sheet private int currSheet; // 当前位置 private int currPosition; // Sheet数量 private int numOfSheets; // HSSFWorkbook HSSFWorkbook workbook = null; // 设置Cell之间以空格分割 private static String EXCEL_LINE_DELIMITER = " "; // 设置最大列数 private static int MAX_EXCEL_COLUMNS = 64; // 构造函数创建一个ExcelReader public ExcelReader(String inputfile) throws IOException, Exception { // 判断参数是否为空或没有意义 if (inputfile == null || inputfile.trim().equals("")) { throw new IOException("no input file specified"); } // 取得文件名的后缀名赋值给filetype this.filetype = inputfile.substring(https://www.360docs.net/doc/5d4376244.html,stIndexOf(".") + 1); // 设置开始行为0 currPosition = 0; // 设置当前位置为0 currSheet = 0; // 创建文件输入流 is = new FileInputStream(inputfile);

C#导出Excel文件名中文乱码问题

C#导出Excel文件名中文乱码问题 string nm="["+Label1.Text+"]"+ DateTime.Now.ToString("yyyy-mm-dd")+".xls"; DataTable dt = sqlHelp.GetObject(sql).Tables[0]; StringBuilder sb = new StringBuilder(); sb.Append("成绩排名\t考试成绩\t学员名称\t考试时间"); StringWriter sw = new StringWriter(); sw.WriteLine(sb.ToString()); for (int i = 0; i < dt.Rows.Count; i++) { int q = i + 1; sb = new StringBuilder(); sb.Append(q.ToString()); sb.Append("\t" + dt.Rows[i][0].ToString()); sb.Append("\t" + dt.Rows[i][1].ToString() + "\t" + dt.Rows[i][2].ToString()); sw.WriteLine(sb.ToString()); } sw.Close(); Response.Clear(); Response.Buffer = true; Response.Charset = "GB2312"; Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(nm, Encoding.UTF8).ToString());

poi读写Excel文件

一、Excel基础 二、HSSF概况 三、通过usermodel读取文件 四、通过usermodel写入文件 五、通过eventusermodel读取文件 六、HSSF电子表格结构 七、通过HPSF读取文档属性 八、文档摘要信息 九、附录 ━━━━━━ 正文: ━━━━━━ 在上一篇文章中,我们介绍了POI项目的基本概念,了解了如何用POI来读写OLE 2复合文档结构,并给出了两个简单的例子:用POI来读写Excel文件的Workbook流。本文继续前文的话题,阐述如何用POI来读取/写入完整的Excel文件。 约定:POI项目2.0版现在已经接近正式发行阶段,开发进度迅速,不断有新的功能集成到原有的系统,同时也有对原有系统的修改。为了保证本文的及时性,本文将按照最近的1.9开发版说明。虽然编译最近的发行版源代码也能正常运行,但现在的代码和2.0的发行版会有一些出入。 一、Excel基础 Microsoft Excel 97文件格式也被称为BIFF8,最近版本的Excel只对该格式作了少量的改动。增加对新格式的支持除了增加项目的复杂性之外,唯一的效果也许只是不得不使每个用户升级代码,没有什么实际的好处。因此,在下文说明中,凡是提到Excel 97格式的地方其实都是指Excel从97到XP的格式。 二、HSSF概况 POI项目实现的Excel 97文件格式称为HSSF——也许你已经猜到,HSSF是Horrible SpreadSheet Format的缩写,也即“讨厌的电子表格格式”(微软使某些原本简单的事情过分复杂,同时又过分简单地处理了某些原本需要灵活性的事情,让人不胜佩服!)也

java的POI操作Excel文件

java的POI操作Excel文件(2) 现在我要做的东西基本完成啦,我把这段时间使用POI的一些心得总结出来,希望能对和我遇到相同问题的朋友有所帮助,至于POI基本的使用方法,自己去看文档吧。 1、设置分页符的bug POI里的HSSFSheet类提供了setRowBreak方法可以设置Sheet的分页符。 Bug:如果你要设置分页符的Sheet是本来就有的,并且你没有在里面插入过分页符,那么调用setRowBreak时POI会抛出空指针的异常。 解决方法:在Excel里给这个sheet插入一个分页符,用POI打开后再把它删掉,然后你就可以随意插入分页符了。 如果sheet是由POI生成的则没有这个问题。我跟踪了setRowBreak的源代码,发现是Sheet.Java下的PageBreakRecord rowBreaks这个变量在搞鬼,如果Sheet里原来没有分页符,开发这个模块的那位兄台忘了为这个对象new实例,所以只能我们先手工给Excel插入一个分页符来触发POI为rowBreaks创建实例。 2、如何拷贝行 我在https://www.360docs.net/doc/5d4376244.html,的POI用户论坛翻遍了每个相关的帖子,找遍了api,也没看到一个拷贝行的方法,没办法,只能自己写: //注:this.fWorkbook是一个HSSHWorkbook,请自行在外部new public void copyRows (String pSourceSheetName, String pTargetSheetName, int pStartRow, int pEndRow, int pPosition) { HSSFRow sourceRow = null; HSSFRow targetRow = null; HSSFCell sourceCell = null; HSSFCell targetCell = null; HSSFSheet sourceSheet = null; HSSFSheet targetSheet = null; Region region = null; int cType; int i; short j; int targetRowFrom; int targetRowTo;

java读取和写入EXCEL文件

java读取和写入Excel文件 在Java中读取Excel文件的内容 在这里,我使用的是一个叫Java Excel API的东西,类似的还有jakarta的POI,不过感觉那个太复杂了点儿。而且jxl对中文的支持相当的好,至少我在用的过程中一点问题没出。 一、下载地址 [url]https://www.360docs.net/doc/5d4376244.html,/jexcelapi/[/url] 二、特性 可以读取Excel 95, 97, 2000文件 可以读或写Excel 97及其以后版本的的公式(不过我发现好像有bug) 生成Excel 97格式的电子表格 支持字体、数字和日期格式化 支持单元格的颜色和阴影 可以编辑现有的文件 三、读文件 //声明一下,记得后面要关闭哦。。 Workbook workbook = null; try { workbook = Workbook.getWorkbook(new File("d:\\temp\\TestRead.xls")); } catch (Exception e) { throw new Exception("file to import not found!"); } Sheet sheet = workbook.getSheet(0); Cell cell = null; int columnCount=3; int rowCount=sheet.getRows(); for (int i = 0; i

EXCEL打开乱码之解决方法

一、文档格式法 这种方法是将损坏的Word文档转换为另一种格式,然后再将其转换回Word文档格式。这是最简单和最彻底的文档恢复方法。 1.在Word中打开损坏的文档后,选择“文件→另存为”,在“保存类型”列表中,选择“RTF格式(*.rtf)”,然后单击“保存”按钮。 2.关闭损坏的文档,打开刚才保存的RTF格式文件,选择“文件→另存为”,在“保存类型”列表中,选择“Word文档(*.doc)”,然后单击“保存”按钮。 3.关闭RTF文档,打开修改后的Word文档。 Word文档与RTF的相互转换将保留其格式,如果这种转换没有纠正文件损坏,则可以尝试与其他字处理格式的相互转换,这将不同程度地保留Word文档的格式。如果使用这些格式均无法解决本问题,可将文档转换为纯文本格式(*.txt),再转换回Word格式。由于纯文本的简单性,这种方法有可能更正损坏处,但是Word文档的所有格式设置都将丢失。 二、重设格式法 Word用文档中的最后一个段落标记关联各种格式设置信息,特别是节与样式的格式设置。这样我们就可以将最后一个段落标记之外的所有内容复制到新文档,就有可能将损坏的内容留在原始文档中。步骤如下: 1.在Word中打开损坏的文档,选择“工具→选项”然后选择“编辑”选项卡,取消“使用智能段落选择范围”复选框前的勾。取消选中该复选框,选定整个段落时,Word将不会自动选定段落标记,然后单击“确定”按钮。 2.选定最后一个段落标记之外的所有内容,方法是:按“Ctrl+End”组合键,然后按 “Ctrl+Shift+Home”组合键。 3.在常用工具栏中,依次单击“复制”、“新建”和“粘贴”按钮

poi读取excel并输出到jsp页面

代码来源于网络,只做了部分修改,我也是刚用到很多都不懂,找了一些例子之类的自己用,有些不错的分享给大家,仅供参考。 下面这个是用servlet做(注意web.xml );其实原理一样;源码如下 readExcelServlet.java package com.test.servlet; import java.io.FileInputStream; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import https://www.360docs.net/doc/5d4376244.html,ermodel.HSSFCell; import https://www.360docs.net/doc/5d4376244.html,ermodel.HSSFDateUtil; import https://www.360docs.net/doc/5d4376244.html,ermodel.HSSFRow; import https://www.360docs.net/doc/5d4376244.html,ermodel.HSSFSheet; import https://www.360docs.net/doc/5d4376244.html,ermodel.HSSFWorkbook; import org.apache.poi.poifs.filesystem.POIFSFileSystem; /** * author:wx * describe:Reads the Excel example * */ public class readExcelServlet extends HttpServlet { /** * */ private static final long serialVersionUID = 1L; /** * * Constructor of the object. */ public readExcelServlet() { super(); } /** * Destruction of the servlet.
* */ public void destroy() { super.destroy(); }// Just puts "destroy" string in log // Put your code here /** * doGet */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

excel表格乱码

竭诚为您提供优质文档/双击可除 excel表格乱码 篇一:excel出现乱码的解决方法 excel出现乱码的原因也是多种多样。如果你遇到excel 打开是乱码,可以从下面找找相应的解决办法。第一,csV 文件用excel打开是乱码 从网页导出的csV文件,用excel打开,中文会是乱码。csV文件乱码问题主要是文件编码引起的。因此要解决excel 打开乱码的问题,可以从改文件开始: 首先,用记事本打开csV文件,可能看到很长的一条数据记录。 然后,直接把刚才打开的文件另存为txt文件,如果是utF-8的文件,你应该可以看到保存成的编辑格式。 最后,用excel直接打开这个另存的文件。应该能看到正确的汉字。 第二,excel文件损坏出现乱码 有时打开一个以前编辑好的excel工作簿,却出现乱码,无法继续进行编辑打印。这种情况的原因应该是该文件已经被损坏了,可以尝试使用下面的方法之一来修复excel乱码。

1.将excel乱码文件另存为sylk格式 如果excel乱码文件能打开,将excel乱码文件转换为sylk格式可以筛选出文档的损坏部分,然后再保存数据。 2.excel乱码文件转换为较早的版本 若因启动故障而没有保存excel乱码文件,则最后保存的版本可能不会被损坏。关闭打开的工作簿,当系统询问是否保存更改时,单击“否”。在“文件”菜单中,单击“打开”命令,双击该工作簿文件。 3.打开excel乱码文件并修复工作簿 如果excel乱码文件根本不能够使用常规方法打开,可以尝试excel20xx中的“打开并修复”功能,该功能可以检查并修复excel乱码文件中的错误。 单击“文件”——“打开”。通过“查找范围”框,定位并打开包含受损文档的文件夹,选择要恢复的文件。单击“打开”按钮旁边的箭头,然后单击“打开并修复”即可。 excel乱码问题也不是一篇能写尽的,因为出现的原因实在太多样。如果上面的方法依然无效,可以借助第三方软件来尝试解决excel乱码。 officeexcelViewer是微软官方出品的一款excel乱码清除修复工具,下载安(excel表格乱码)装完毕,用officeexcelViewer打开有乱码的excel文档,然后复制单元格,并将它们粘贴到excel的一个新工作簿中。出现excel

poi读写excel案例

Java-Excel 报表开发 POI (2009-02-19 21:44:10) 转载▼ 分类:java 标签: java 杂谈 开发环境为windowsXP-SP2,Eclipse3.2,JDK1.5.07,其实差不多都行,不会有太大的差异。本文从POI 下载开始讲解,前提是开发环境包括系统变量等等已经正确设置完毕。 1.POI的下载 截至本文发表,POI最新版本是3.0.1,距离上一个Final版本有3年了吧,以至于我差点儿就把他放弃了——以为没人管了。官方的公告讲,这一版主要是追加了一些新的特性和BUG修正,不过稍微有点儿遗憾的是,还不能很好的操作Excel2007。 POI官方网址: https://www.360docs.net/doc/5d4376244.html,/ JAR包下载: https://www.360docs.net/doc/5d4376244.html,/poi/release/bin/poi-bin-3.0.1-FINAL-20070705.zip 源码下载: https://www.360docs.net/doc/5d4376244.html,/poi/release/src/poi-src-3.0.1-FINAL-20070705.zip 下载上面的JAR和源码(源码不是必须的,但是为了早日修得正果,深入系统的看看POI代码还是有必要的)并解压待用。 2.用Eclipse搭建项目 打开Eclipse 依次点击File->New->Java Project 输入项目名称,本例中设置为POI 单击完成 在项目上点击右键->New->Folder 输入文件夹名称lib 把刚才解压的poi-3.0.1-FINAL-20070705.jar复制过来 右键点击项目,选择Properties 在左侧列表里选中Java Build Path,右侧选中Libraries 点击Add JARs,选择POI项目的lib下的所有文件 两次OK确认,回到Eclipse界面 小技巧,快捷操作:可以用鼠标左键选中poi-3.0.1-FINAL-20070705.jar但不松开,拖到任务栏的Eclipse 图标上等候1秒左右,Eclipse会自动弹起来,依然不松开移动到lib文件夹上,这个时候鼠标后面跟个十

在Java中读写Excel文件

在Java中读写Excel文件 Jakarta的POI项目提供了一组操纵Windows文档的Java API,如下几个类提供了操作Excel文件的方便的途径:HSSFWorkbook、HSSFSheet、HSSFRow、HSSFCell,分别代表了Excel电子表格中的Book、Sheet、行和单元格。 你可以在下面地址下载到最新的POI工具包: https://www.360docs.net/doc/5d4376244.html,/poi/index.html 下面的代码创建一个Excel文件test.xls,并在第一行的第一格中写入一条消息: 1.import https://www.360docs.net/doc/5d4376244.html,ermodel.*; 2.import java.io.FileOutputStream; 3. 4.// code run against the jakarta-poi-1. 5.0-FINAL-2002050 6.jar. 5.public class PoiTest { 6. 7.static public void main(String[] args) throws Exception { 8.FileOutputStream fos = new FileOutputStream("d:\test.xls"); 9. HSSFWorkbook wb = new HSSFWorkbook(); 10. HSSFSheet s = wb.createSheet(); 11. wb.setSheetName(0, "first sheet"); 12. HSSFRow row = s.createRow(0); 13.HSSFCell cell = row.createCell(0); 14.cell.setCellValue("Hello! This message is generated from POI."); 15. wb.write(fos); 16. fos.close(); 17. } 18. 19.} 读取Excel文件时,首先生存一个POIFSFileSystem对象,由POIFSFileSystem 对象构造一个HSSFWorkbook,该HSSFWorkbook对象就代表了Excel文档。下面代码读取上面生成的Excel文件写入的消息字串: 1. POIFSFileSystem fs = null; 2. HSSFWorkbook wb = null; 3.

Java读写Excel之POI入门

Java读写Excel之POI入门 Apache POI 是用Java编写的免费开源的跨平台的Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。 Apache POI 是创建和维护操作各种符合Office Open XML(OOXML)标准和微软的OLE 2复合文档格式(OLE2)的Java API。用它可以使用Java读取和创建,修改MS Excel文件.而且,还可以使用Java读取和创建MS Word和MSPowerPoint文件。Apache POI 提供Java操作Excel解决方案(适用于Excel97-2008)。 如果处理.xlsx、docx、pptx的话可以试试Docx4j 。 ?HSSF -提供读写Microsoft Excel XLS格式档案的功能。 ?XSSF -提供读写Microsoft Excel OOXML XLSX格式档案的功能。 ?HWPF -提供读写Microsoft Word DOC格式档案的功能。 ?HSLF -提供读写Microsoft PowerPoint格式档案的功能。 ?HDGF -提供读Microsoft Visio格式档案的功能。 ?HPBF -提供读Microsoft Publisher格式档案的功能。 ?HSMF -提供读Microsoft Outlook格式档案的功能。 版本:poi-3.8-20120326.jar 1、生成Workbook Java代码

2、生成Workbook OOXML形式(.xlsx) Java代码 3、打开Workbook Java代码

excel表格打开是乱码怎么办

竭诚为您提供优质文档/双击可除excel表格打开是乱码怎么办 篇一:打开excel表出现文件转换乱码的处理方法 打开excel表出现文件转换乱码的处理方法 问题:打开excel表出现文件转换乱码,按确定显示乱码。 问题分析:xls文件默认打开快捷方式为word。 解决方法:1、在该文件单击右键,选择“属性”; 2、在弹出属性对话框点击打开方式“更改(c)”, 3、在弹出对话框中选择excel程序,按2次“确定”; 4、重新双击需要打开的excel文件。 如下图所示: 篇二:wordexcel打开乱码的解决方法 wordexcel打开乱码的解决方法 打开的word文件中全是些乱码,无法打开,word打开时提示说需要安装转换器,excel打开时说格式不符合,有的打开后直接是乱码,遇到这些问题如何解决,今天我们就来学习一下: 第一种方法:文件格式替换法

1、打开被损坏的文档单击"文件----另存为"菜单,在"保存类型"列表中,选择"RtF格式",然后单击保存"按钮,并 关闭word。 2、打开刚才保存的RtF格式文件,再次使用"另存为"将文件重新保存为"word文档",现在打开这个word文件就可以发现文件已经被恢复过来了。 第二种:其他方法。 1、使用undelete类软件:用于刚出问题的情况时。一般word修改文件时都创建临时文件。到修改word文件的目录下去找。 2、使用word的恢复功能:即在word中,文件----打开命令,选择打开文件的类型为"从任意文件中恢复文本",然 后打开,如果不行,可以试用wps97或wps2000读入word文件,也许也有可能恢复。 3、用wordrecoverytools可以恢复任意损坏的word文件。 有时候word文档出现乱码,并不是由于数据恢复引起的,可能是因为电脑中了病毒,病毒的复制和传播引起的数据破坏,这样的情况是很难恢复的,所以建议大家对重要的数据 文档做定期备份,以免造成没有必要的损失。 篇三:excel中文显示乱码解决方法 excel中文显示乱码解决方法

使用POI读取excel文件内容

使用POI读取excel文件内容 package edu.sjtu.erplab.poi;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.text.SimpleDateFormat;import java.util.Date;import java.util.HashMap;import java.util.Map;import https://www.360docs.net/doc/5d4376244.html,ermodel.HSSFCell;import https://www.360docs.net/doc/5d4376244.html,ermodel.HSSFDateUtil;import https://www.360docs.net/doc/5d4376244.html,ermodel.HSSFRow;import https://www.360docs.net/doc/5d4376244.html,ermodel.HSSFSheet;import https://www.360docs.net/doc/5d4376244.html,ermodel.HSSFWorkbook;import org.apache.poi.poifs.filesystem.POIFSFileSystem;/** * 操作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)

POI操作excel大全

POI操作excel大全 第一讲:基本的Excel读写本文主要演示一下POI的基本操作,例如怎样读取和创建一个具体的Excel文件。按照惯例,拿HelloWorld说事儿。 说明:本文主要内容皆包含于官方帮助手册,之所以要拿出来,出于两个原因,手册是英文的+手册是对应 2.5.1的。 核心代码如下,注释部分为讲解。 这里只挑干的讲,完整的代码请参考(下载代码)。 //创建一个空白的WorkBook HSSFWorkbook wb = new HSSFWorkbook(); //基于上面的WorkBook创建属于此WorkBook 的Sheet, // 3.0.1版在使用全角Sheet名的时候不必再setEncdoing了,个人感觉方便了许多。H SSFSheet st = wb.createSheet(“测试页“); //创建属于上面Sheet的Row,参数0可以是0~65535之间的任何一个, //注意,尽管参数是Int类型,但是Excel最多支持65536行 HSSFRow row = st.createRow(0); //创建属于上面Row的Cell,参数0可以是0~255之间的任何一个, //同样,是因为Excel最大支持的列数为256列 HSSFCell cell = row.createCell((short)

0); //设置此单元格的格式为文本,此句可以省略,Excel会自动识别。 //其他还有几种常用的格式,请参考本文底部的补充部分。c ell.setCellType(HSSFCell.CELL_TYPE_STRING); //此处是 3.0.1版的改进之处,上一版可以直接 setCellValue(“Hello, World!“), //但是在 3.0.1里,被deprecated了。c ell.setCellValue(new HSSFRichTextString(“Hello, World!“)); //创建一个文件输出流,指定到C盘根目录下(C盘都有吧?) //xls是Excel97-2003的标准扩展名,xx是xlsx,目前的POI能直接生产的还是xls格式, //如果此处把扩展名改成xlsx,在用Excelxx打开此文件时会报错。F ileOutputStream writeFile = new FileOutputStream(“c:/helloworld.xls“); //把WorkBook写到流里 wb.write(writeFile); //记得手动关闭流,官方文档已经做了特别说明,说POI不负责关闭用户打开的流。所以. writeFile.close(); 上面就是创建一个新文档的简易代码,下面的例子是读取刚才创建的Excel并把读取到的内容显示在控制台上。 //指定要读取的文件,本例使用上面生成的helloworld.xls FileInputStream readFile = new FileInputStream(“c:/helloworld.xls“); //创建一个WorkBook,从指定的文件流中创建,即上面指定了的文件流

POI解析excel2007和生成excel2007

最近几天在整理客户的数据,数据量比较大,有几十万条,用到了excel。用户提供的数据有很多重复的,这个我们要挑拣出来,我用代码写挑拣重复的数据,原来用jxl解析excel,发现excel不支持office2007,并且excel2003最大的行数只能是65535,这样就不能运行一次代码解决问题了。查了下资料,apache 的POI可以解析office2007。下面两个简单例子望能提供给网友参考。 1.读取excel2007 Java代码 1. //office2007工作区 2. XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream( "D:/temp/test_poi.xlsx")); 3. //获得该工作区的第一个sheet 4. XSSFSheet sheet = wb.getSheetAt(0); 5. //总共有多少行,从0开始 6. int totalRows = sheet.getLastRowNum(); 7. for (int i = 0; i <= totalRows; i++) { 8. //取得该行 9. XSSFRow row = sheet.getRow(i); 10. //注释的代码,是为了防止excel文件有空行 11.// if(row == null) { 12.// continue; 13.// } 14. System.out.println(row.getCell(1).toString()); 15. } 2.生成excel2007 Java代码 1.//输出流 2.OutputStream os = new FileOutputStream("D:/temp/create.xlsx"); 3.//工作区 4.XSSFWorkbook wb = new XSSFWorkbook(); 5.//创建第一个sheet 6.XSSFSheet sheet= wb.createSheet("test"); 7.//生成第一行 8.XSSFRow row = sheet.createRow(0); 9.//给这一行的第一列赋值 10.row.createCell(0).setCellValue("column1"); 11.//给这一行的第一列赋值 12.row.createCell(1).setCellValue("column2");

java操作EXCEL表格经典例子详解

Microsoft的Office系列产品拥有大量的用户,Word、Excel也成为办公文件的首选。在Java 中,已经有很多对于Word、Excel的开源的解决方案,其中比较出色的是Apache的Jakata 项目的POI子项目。该项目的官方网站是https://www.360docs.net/doc/5d4376244.html,/poi/。 POI包括一系列的API,它们可以操作基于MicroSoft OLE 2 Compound Document Format的各种格式文件,可以通过这些API在Java中读写Excel、Word等文件。POI是完全的Java Excel 和Java Word解决方案。POI子项目包括:POIFS、HSSF、HDF、HPSF。表7-2对它们进行了简要介绍。 表7-2 POI子项目介绍 子项目名 说明 POIFS(POI File System) POIFS是POI项目中最早的最基础的一个模块,是Java到OLE 2 Compound Document Format 的接口,支持读写功能,所有的其他项目都依赖与该项目。 HSSF(Horrible Spreadsheet Format) HSSF是Java到Microsoft Excel 97(-2002)文件的接口,支持读写功能 HWPF(Horrible Word Processing Format) HWPF是Java到Microsoft Word 97文件的接口,支持读写功能,但目前该模块还处于刚开始开发阶段,只能实现一些简单文件的操作,在后续版本中,会提供更强大的支持 HPSF(Horrible Property Set Format) HPSF 是Java到OLE 2 Compound Document Format文件的属性设置的接口,属性设置通常用来设置文档的属性(标题,作者,最后修改日期等),还可以设置用户定义的属性。HPSF支持读写功能,当前发布版本中直支持读功能。 7.3.1 对Excel的处理类 下面通过HSSF提供的接口对Excel文件经行处理。首先需要下载POI的包,可以到apache 的官方网站下载,地址为:https://www.360docs.net/doc/5d4376244.html,/jakarta/poi/,本书采用的是 poi-2.5.1-final-20040804.jar,读者可以下载当前的稳定版本。把下载的包按照前面介绍的方式加入Build Path,然后新建一个ch7.poi包,并创建一个ExcelReader类。 ExcelReader类可以读取一个XLS文件,然后将其内容逐行提取出来,写入文本文件。其代码如下。 代码7.6 public class ExcelReader {

解决数据恢复软件恢复word excel后文档乱码问

你可以试试下面这篇文章 有的时候可能由于操作的问题,当你再次打开一个你认为没有问题的文档时,可能会看见文件中一片乱码更本就无法阅读!如果出现了这写情况可以通过下面的两个方法,来挽救你的文件。 一、替换格式法 这种方法就是把被破坏的Word文档另存为另一种格式。 1、打开被损坏的文档单击“文件/另存为”菜单,在“保存类型”列表中,选择“RTF格式”,然后单击“保存”按钮,并关闭word。 2、打开刚才刚才保存的RTF格式文件,再次使用“另存为”将文件重新保存为“W ord文档”,现在打开这个word文件就可以发现文件已经被恢复过来了。 如果在转换成rtf格式后文件仍然不能被恢复,可以将文件再次转换为纯文本格式(*.txt),再转换回Word格式。当然在转换为txt 文件的时候其图片等信息会丢失掉。 二、重设格式法 在Word有一个隐藏的位置,用来保存文档中的各种格式信息,所以只要删除这些格式信息就可以将文件恢复了。 1、在打开损坏的文档后,单击“工具/选项”菜单,选择“编辑”标

签,取消对“使用智能段落选择范围”复选框的勾选,然后单击按钮。这样就可以修复文件了 2、选定最后一个段落之外的全部内容,然后将这些内容粘贴复制到新的word文件中即可 另外:当Word文档无法打开时,可考虑采取以下措施: (1)首选用Word的自动恢复功能。用于刚出问题的情况,而且问题是Word打开文件可 以,但是打开后出错或死机的情况:) 在打开文件中且死机前,断一下电,1/3的情 况可以恢复。 (2)使用undelete类软件:用于刚出问题的情况时。一般Word修改文件时都创建临时 文件。到修改word文件的目录下去找(不受系统temp和tmp变量的影响)。偶有成功 者。 (3)使用word的恢复功能:即在word中,文件|打开命令,选择打开文件的类型为“从 任意文件中恢复文本”,然后打开,如果不行,可以试用wps97或wps2000读入word文 件,也许也有可能恢复。 (4)用16进制编辑器如UltraEdit32、Winhex等打开Word文档,把

POI操作Excel常用方法总结

POI操作Excel常用方法总结 一、POI简介 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 二、HSSF概况 HSSF 是Horrible SpreadSheet Format的缩写,通过HSSF,你可以用纯Java代码来读取、写入、修改Excel文件。HSSF 为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”。 三、POI EXCEL文档结构类 HSSFWorkbook excel文档对象 HSSFSheet excel的sheet HSSFRow excel的行 HSSFCell excel的单元格HSSFFont excel字体 HSSFName 名称HSSFDataFormat 日期格式 HSSFHeader sheet头 HSSFFooter sheet尾 HSSFCellStyle cell样式 HSSFDateUtil 日期 HSSFPrintSetup 打印 HSSFErrorConstants 错误信息表 四、EXCEL常用操作方法 1、得到Excel常用对象

view plaincopy to clipboardprint? 1.POIFSFileSystem fs=newPOIFSFileSystem(new FileInputStream("d:/test.xls")) ; 2.//得到Excel工作簿对象 3.HSSFWorkbook wb = new HSSFWorkbook(fs); 4.//得到Excel工作表对象 5.HSSFSheet sheet = wb.getSheetAt(0); 6.//得到Excel工作表的行 7.HSSFRow row = sheet.getRow(i); 8.//得到Excel工作表指定行的单元格 9.HSSFCell cell = row.getCell((short) j); 10.cellStyle = cell.getCellStyle();//得到单元格样式 1.HSSFWorkbook wb = new HSSFWorkbook();//创建Excel工作簿对象 2.HSSFSheet sheet = wb.createSheet("new sheet");//创建Excel工作表对象 3.HSSFRow row = sheet.createRow((short)0); //创建Excel工作表的行 4.cellStyle = wb.createCellStyle();//创建单元格样式 5.row.createCell((short)0).setCellStyle(cellStyle); //创建Excel工作表指定行 的单元格 6.row.createCell((short)0).setCellValue(1); //设置Excel工作表的值

使用POI解析(txt,doc,docx,xls,xlsx)文件方法总结

本人最近写了用POI解析txt,doc,docx,xls,xlsx等五个格式的文件,整理一下: 可能写的不是很简单,但是可用。 最近上传文件,解析文件,我天天都在写,写的头都大了。。。 所有整理一下主要的核心的代码,即助人为乐,也给自己留个备份。呵呵 欢迎参考 首先需要引用jar包: 这些jar包网上都是可以找的到的 1、首先要先读取到文件, String targetDirectory = ServletActionContext.getServletContext().getRealPath("/wenjian");//获取路径 这是获取服务器中wenjian这个文件夹下的所有文件。 //读取指定文件夹下的所有文件名称 File file=new File(targetDirectory); String test[]; test=file.list(); 所有的文件名称都在这个list中, 用循环可以得到文件的后缀名 for(int i=0;i

相关文档
最新文档