Can't obtain the input stream from /docProps/app.xml

今天在做poi修改样式时,报了以下错误:

Exception in thread "main" org.apache.poi.POIXMLException: java.io.IOException: Can't obtain the input stream from /docProps/app.xml
    at org.apache.poi.POIXMLDocument.getProperties(POIXMLDocument.java:148)
    at org.apache.poi.POIXMLDocument.write(POIXMLDocument.java:199)
    at com.supcon.ChangeXlsxCell.main(ChangeXlsxCell.java:29)
Caused by: java.io.IOException: Can't obtain the input stream from /docProps/app.xml
    at org.apache.poi.openxml4j.opc.PackagePart.getInputStream(PackagePart.java:502)
    at org.apache.poi.POIXMLProperties.<init>(POIXMLProperties.java:75)
    at org.apache.poi.POIXMLDocument.getProperties(POIXMLDocument.java:146)
    ... 2 more

网上查了相关文档,没找到相关资料,也没有给出解决资料,绝望之余,网上查找了poi修改数据的代码,运行了下竟然可以通过,以下为代码:

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

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

public class ChangeCell {

	@SuppressWarnings("deprecation")
	public static void main(String[] args) {
		String fileToBeRead = "C:\exp.xls"; // excel位置
		int coloum = 1; // 比如你要获取第1列
		try {
			HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(
					fileToBeRead));
			HSSFSheet sheet = workbook.getSheet("Sheet1");

			for (int i = 0; i <= sheet.getLastRowNum(); i++) {
				HSSFRow row = sheet.getRow((short) i);
				if (null == row) {
					continue;
				} else {
					HSSFCell cell = row.getCell((short) coloum);
					if (null == cell) {
						continue;
					} else {
						System.out.println(cell.getNumericCellValue());
						int temp = (int) cell.getNumericCellValue();
						cell.setCellValue(temp + 1);
					}
				}
			}
			FileOutputStream out = null;
			try {
				out = new FileOutputStream(fileToBeRead);
				workbook.write(out);
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				try {
					out.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

}

 我的错误代码如下:

String fileToBeRead = "D:\template.xlsx"; // excel位置
		File dataFile=new File(fileToBeRead);
		try {
			XSSFWorkbook workbook = new XSSFWorkbook(dataFile);
			XSSFSheet sheet = workbook.getSheet("Sheet1");
			FileOutputStream out = null;
			try {
				out = new FileOutputStream(fileToBeRead);
				workbook.write(out);
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				try {
					out.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

简单比较以下差异处在XSSFWorkbook初始化的时候:

XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(fileToBeRead));(正确的)

XSSFWorkbook workbook = new XSSFWorkbook(dataFiel);(错误的)

错误的描述是无法获得输入流: can  not  obtain  input  stream  for  xml....

 是不是一个outputStream一定要对应一个InputStream呢?????

以上错误代码修改如下,即可通过:

String fileToBeRead = "D:\template.xlsx"; // excel位置
		File dataFile=new File(fileToBeRead);
		try {
			XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(fileToBeRead));
			XSSFSheet sheet = workbook.getSheet("Sheet1");
			FileOutputStream out = null;
			try {
				out = new FileOutputStream(fileToBeRead);
				workbook.write(out);
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				try {
					out.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}