我想使用 apache poi api 在 java 中读取 2010 excel 文件......但它给了我一个错误线程“main”中的异常 java.lang.IllegalArgumentException: Sheet index (0) is out of range (0..-1 ) 我正在使用 xssf 但如果我想从旧格式的 excel 中获取数据,那么它可以通过 HSSF 正常工作..我不知道 XSSF 发生了什么..这是我的代码..请帮助我。
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.Iterator;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
* This java program is used to read the data from a Excel file and display them
* on the console output.
*
* @author dhanago
*/
public …Run Code Online (Sandbox Code Playgroud) 在我的excel工作表中,许多单元格包含公式,当我用Apache POI阅读excel时,我不想重新计算这些公式。
我这样做的方式:
if(cell.getCellType() == XSSFCell.CELL_TYPE_FORMULA) {
//System.out.println("Formula is " + cell.getCellFormula());
switch(cell.getCachedFormulaResultType()) {
case XSSFCell.CELL_TYPE_NUMERIC:
System.out.print(cell.getNumericCellValue() +" ");
break;
case XSSFCell.CELL_TYPE_STRING:
System.out.print(cell.getRichStringCellValue()+" ");
break;
}
}
Run Code Online (Sandbox Code Playgroud)
这有助于我获得单元格中的原始值。例如,如果单元格的值为19.5%,这将为我提供0.195456。我想获取格式化的值。
一种获取格式化值的方法是:
DataFormatter formatter = new DataFormatter();
System.out.print(formatter.formatCellValue(cell));
Run Code Online (Sandbox Code Playgroud)
这对于常规单元格效果很好,但是对于具有公式的单元格,它实际上会获取公式字符串并显示它,即,它不会获取缓存的值并对其进行格式化,而只是返回公式字符串。
从CELL_TYPE_FORMULA检索值后,是否可以格式化该值
我正在尝试为xssfcell设置一些自定义的颜色(从hexcode或rgb值开始),但是即使我提供了其他颜色,单元的颜色也正在变成黑色。我尝试通过以下方式进行操作:
File xlSheet = new File("C:\\Users\\IBM_ADMIN\\Downloads\\Excel Test\\Something3.xlsx");
System.out.println(xlSheet.createNewFile());
FileOutputStream fileOutISPR = new FileOutputStream("C:\\Users\\IBM_ADMIN\\Downloads\\Excel Test\\Something3.xlsx");
XSSFWorkbook isprWorkbook = new XSSFWorkbook();
XSSFSheet sheet = isprWorkbook.createSheet("TEST");
XSSFRow row = sheet.createRow(0);
XSSFCellStyle cellStyle = isprWorkbook.createCellStyle();
byte[] rgb = new byte[3];
rgb[0] = (byte) 24; // red
rgb[1] = (byte) 22; // green
rgb[2] = (byte) 219; // blue
XSSFColor myColor = new XSSFColor(rbg);
cellStyle.setFillForegroundColor(myColor);
cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
cellStyle.setAlignment(HorizontalAlignment.CENTER);
XSSFCell cell = row.createCell(0);
cell.setCellValue("Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum …Run Code Online (Sandbox Code Playgroud) 我已经使用XLS,但今天我正在尝试新的 - xlsx.对于XLS,我只需要一个库,与XLSX(四个库)相比.此外,我得到整个包错误.为什么会这样?
主要:
public class Start {
public static void main(String[] args) {
ReaderXls read = new ReaderXls();
List<List<String>> listAsu = new ArrayList<List<String>>(read.ReaderXls("Sprav_oborudovania",0, 10, 30));
System.out.println(listAsu); }
}
Run Code Online (Sandbox Code Playgroud)
代码:
package workhere;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ReaderXls {
public List<List<String>> ReaderXls(String sfilename,int firstColumn, int columnsCount, int rowsCount){
int lastColumn=firstColumn+columnsCount;
List<List<String>> rowsContent = new ArrayList<List<String>>();
try ( FileInputStream fileInputStream = new FileInputStream("C:\\Users\\student3\\"+sfilename+".xlsx");)
{//Get …Run Code Online (Sandbox Code Playgroud) 我使用下面的代码从XLSX文件中获取日期值.对于某些xlsx文件,这是完全正常的.但它没有提供xlsx文件中的确切日期格式.此问题适用于某些文件.
例如; 我有这样的约会,21/01/2016 (dd/mm/yyyy)
但在阅读之后,它给出了日期01/21/16(mm/dd/yy)
有没有其他方法可以获得cellstyle?
是xlsx文件的问题??
String dateFmt = cell.getCellStyle().getDataFormatString();
if (DateUtil.isCellDateFormatted(cell)) {
double val = cell.getNumericCellValue();
Date date = DateUtil.getJavaDate(val);
String dateFmt = cell.getCellStyle().getDataFormatString();
System.out.println("dateFmt "+dateFmt);
value = new CellDateFormatter(dateFmt).format(date);
System.out.println("Date "+value);
}
Run Code Online (Sandbox Code Playgroud) 我通过创建一个 Excel 文件Apache POI XSSF,并使用密码锁定工作表,以便用户无法更改前两行和前五列的值(我锁定工作表并允许编辑其他单元格)。一切正常,唯一的问题是用户无法调整列的大小,因此他既无法更改也无法调整列的大小以读取所有单元格值。即使工作表受到保护,是否可以允许调整列大小?这是我的配置
workbook = new XSSFWorkbook();
sheet = workbook.createSheet("Sheet1");
sheet.protectSheet("passwordExcel");
unlockedNumericStyle = workbook.createCellStyle();
unlockedNumericStyle.setLocked(false);
// Format cell for date
dateStyle = workbook.createCellStyle();
CreationHelper createHelper = workbook.getCreationHelper();
dateStyle.setDataFormat(createHelper.createDataFormat().getFormat("dd/mm/yyyy"));
sheet.autoSizeColumn(1);
Run Code Online (Sandbox Code Playgroud)
我读过,lockFormatCell()但我不明白它是否可以帮助我。谢谢
我正在尝试使用 Apache POI 创建加密的 xlsx 文件。这是我的代码,它运行得很好:
public static void Encrypt(String data) throws IOException, GeneralSecurityException, InvalidFormatException {
Workbook wb = new XSSFWorkbook();
Sheet sheet1 = wb.createSheet("sheet1");
sheet1.createRow(0).createCell(0).setCellValue(data);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
wb.write(bos);
bos.close();
POIFSFileSystem fs = new POIFSFileSystem();
EncryptionInfo info = new EncryptionInfo(EncryptionMode.agile, CipherAlgorithm.aes256, HashAlgorithm.sha512, 256, 16, ChainingMode.cbc);
Encryptor enc = info.getEncryptor();
enc.confirmPassword("pass");
OPCPackage opc = OPCPackage.open(new ByteArrayInputStream(bos.toByteArray()));
OutputStream os = enc.getDataStream(fs);
opc.save(os);
opc.close();
FileOutputStream fos = new FileOutputStream("provawrite.xlsx");
fs.writeFilesystem(fos);
fos.close();
}
Run Code Online (Sandbox Code Playgroud)
问题是当我打开生成的文件时,excel 一直抱怨文件已损坏。我还尝试EncryptionInfo使用不同的加密模式更改实例化,但没有任何变化。
有人可以给我一个提示吗?!?