我试图获取XLSX文件的单元格的字体颜色.我正在使用apache poi.我能够获得单元格颜色而不是字体颜色.任何建议将不胜感激.
谢谢
我正在编写一个Java程序,它从.xlsx文件中读取并以.csv格式提供输出.这是我的代码:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
public class xlsxToCsv {
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
File inputFile = new File("C:\\inputFile.xlsx");
File outputFile = new File("C:\\outputFile.csv");
xlsx(inputFile, outputFile);
long stopTime = System.currentTimeMillis();
long elapsedTime = stopTime - startTime;
System.out.println(elapsedTime);
}
private static void xlsx(File inputFile, File outputFile) {
//for storing data …Run Code Online (Sandbox Code Playgroud) 我有一个.xlsx文件,其中包含包含不同数据的多个工作表。在所有工作表中,一个工作表需要容纳近100,000行数据,并且数据需要使用带poi的Java写入。
对于SXSSFWorkbook来说,这似乎非常简单快捷,其中我只能在内存中保留100行,但是缺点是我只能写入一个新文件(或覆盖现有文件)。
另外,不允许我“加载”现有文件,即
SXSSFWorkbook wb = new SXSSFWorkbook(file_input_stream) Run Code Online (Sandbox Code Playgroud) 不允许。
我可以使用Workbook工厂:
Workbook workbook = new SXSSFWorkbook();
workbook = WorkbookFactory.create(file_input_stream);Run Code Online (Sandbox Code Playgroud)
但是当我需要冲洗行时,
((SXSSFSheet)sheet).flushRows(100); Run Code Online (Sandbox Code Playgroud)
我收到错误消息,不允许从XSSFSheet到SXSSFSheet进行类型转换。
我试图查看是否有任何方法可以在不同的工作簿之间复制工作表,但到目前为止,似乎必须逐个单元地完成工作。
有关如何解决此问题的任何见解?
晚上好!我在使用apache poi v.3.14时遇到了一些麻烦,当我使用Libreoffice或Excel打开渲染的xlsx时,样式未正确应用.
我有这个代码:
class... {
private XSSFCellStyle doubleLockStyle;
/**
* Create default cell style.
*
* @param myWorkBook
* @return The cell style.
*/
private XSSFCellStyle createCell(XSSFWorkbook myWorkBook, boolean locked) {
XSSFCellStyle cs = myWorkBook.createCellStyle();
cs.setAlignment(HorizontalAlignment.CENTER);
if (locked) {
cs.setFillBackgroundColor(LOCKED_COLOR); //rgb from awt colors
cs.setFillPattern(FillPatternType.SOLID_FOREGROUND);
cs.setLocked(true);
} else {
cs.setLocked(false);
}
return cs;
}
/**
* Prepare cell styles.
*
* @param myWorkBook
*/
private void initStyles(XSSFWorkbook myWorkBook) {
...
short df = myWorkBook.createDataFormat().getFormat("0.00");
doubleLockStyle = createCell(myWorkBook, true);
doubleLockStyle.setDataFormat(df); …Run Code Online (Sandbox Code Playgroud) 我看到与此标头有关的多个问题,但没有得到我的答案。
private void createHandBackFile(XSSFSheet sheet, String programId, XSSFWorkbook workbook) throws IOException {
String output = "C:\\Users\\muddassirr\\Downloads\\Personal\\STORE\\Output";
File file = new File(output + File.separator + programId);
if (!file.exists()) {
file.mkdirs();
}
int noOfColumns = sheet.getRow(0).getPhysicalNumberOfCells();
for(int i = 0; i < noOfColumns; i++) {
sheet.autoSizeColumn(i);
}
FileOutputStream outputStream = new FileOutputStream(new File(output + File.separator + programId + File.separator + "HAND_BACK.xlsx"));
workbook.write(outputStream);
outputStream.close();
workbook.close();
}
Run Code Online (Sandbox Code Playgroud)
没有编译错误。但是当我运行时,我得到运行时错误提示
java: cannot find symbol
symbol: method close()
location: variable workbook of type org.apache.poi.xssf.usermodel.XSSFWorkbook
Run Code Online (Sandbox Code Playgroud) 我正在尝试读取 excel 文件...进行一些更改...保存到新文件。
我用按钮创建了小表单......按下按钮时......
现在的问题是内存问题。
加载表单后,我可以在 Windows 任务管理器中看到...javaw 使用了大约 23MB。
在读写 excel 期间……内存高达 170MB。
阵列列表被清除后....内存没有清除并保持在 150MB 左右。
以下代码附加到事件以单击按钮。
MouseListener mouseListener = new MouseAdapter() {
public void mouseReleased(MouseEvent mouseEvent) {
if (SwingUtilities.isLeftMouseButton(mouseEvent)) {
ArrayList<Address> addresses = ExcelFunctions.getExcelData(fn);
for (Address address : addresses){
address.setZestimate(Integer.toString(rnd.nextInt(45000)));
address.setRedfinestimate(Integer.toString(rnd.nextInt(45000)));
}
ExcelFunctions.saveToExcel(ofn,addresses);
addresses.clear();
JOptionPane.showMessageDialog(null, "Done");
}
}
};
Run Code Online (Sandbox Code Playgroud)
此类中读取/Excel 文件的代码。
public class ExcelFunctions {
public static ArrayList<Address> getExcelData(String fn)
{
ArrayList<Address> output = new ArrayList<Address>();
try
{
FileInputStream file …Run Code Online (Sandbox Code Playgroud) 我有一个Web应用程序(tomcat 8.5.4,java 1.7.0_72),它以前使用Apache POI生成有效的xlsx excel文件.我正在努力转换应用程序以使用maven管理jar依赖项,现在生成的文件被excel视为已损坏(或无效).我根本没有更改生成文件的代码,并且包含的jar大部分都与一些版本更改相同,并删除了一些未使用但不在maven依赖关系树中的jar(删除了下面列出的jar).
有谁知道我可以做什么导致POI生成不同的文件或为什么excel认为这些更改使它无效?我搜索了很多POI和损坏的excel文件的错误,看起来POI中有几个错误,如果它可能破坏现有文件或破坏创建大文件,但在这种情况下似乎没有任何看起来应用.我在这里看到了几个问题,看起来它们可能相似,但最终没有应用.
当我将之前和之后创建的xlsx文件更改为zip文件并提取它们然后将目录与windiff进行比较时,差异是(工作 - >已损坏).
[CONTENT_TYPES] .XML
<?xml version="1.0" encoding="UTF-8" standalone="no"?> -> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"> -> <Types>
Run Code Online (Sandbox Code Playgroud)
_rels.rels,_rels\workbook.xml.rels
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"> -> <Relationships>
Run Code Online (Sandbox Code Playgroud)
docprops\core.xml
创造的时间不同
<?xml version="1.0" encoding="UTF-8" standalone="no"?> -> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Run Code Online (Sandbox Code Playgroud)
XL\styles.xml
numFmtId低1
xl\worksheets\sheet1.xml,docprops\app.xml,xl\_ sharedstrings.xml,xl\workbook.xml
相同
我的公司正在使用本地神器存储库,而不是指向官方maven存储库,所以加载所有依赖项很有趣.我的假设是这是由我丢失的jar或使用错误的版本引起的,但是我实际上并没有产生任何错误,只是得到一个糟糕的文件.
我包括poi-3.1.11.jar,poi-ooxml-3.11.jar和poi-ooxml-schemas-3.11.jar.以前我们在tomcat/lib中使用了commons-codec 1.9,在WEB-INF/lib中使用了commons-codec 1.3.在maven我已经包含1.9,虽然我也尝试回到1.3并且文件仍然被破坏.
我尝试升级到3.1.14的所有poi版本,但这并没有解决它.我试着回到之前正在工作但没有解决它的确切的poi [-ooxml-schemas] -3.11-20141221罐子.我尝试将SXSSFWorkbook切换到正常的XSSFWorkbook,但没有解决它.
这是我转换为maven时删除的jar列表,其中任何一个都会对apache poi产生影响吗?
ecj-4.5.1
el-impl-2.2
itext-2.0.8
jimi-1.0
js
opencsv-1.8
standard (1.1.2)
Run Code Online (Sandbox Code Playgroud) 我正在尝试在流式工作簿(SXSSFWorkbook)中创建Excel表。API不直接支持它,但是通过访问基础XSSFWorkbook(workbook.getXSSFWorkbook),我已经取得了一些成功。
当我在Excel(2007)中打开文件时,它显示“ Excel在“ test.xlsx”中发现了不可读的内容。您要恢复此工作簿的内容吗?”。单击是可以成功修复该工作簿,并且我得到正确的结果。
日志中显示“修复的记录:/xl/tables/table1.xml部分中的表(表)”。
任何人都有关于如何避免Excel错误的想法?
下面是一个示例:
public class SXSSFTest {
private static final int NB_ROWS = 5;
private static final int NB_COLS = 5;
public static void main(String[] args) throws Exception {
try (SXSSFWorkbook workbook = new SXSSFWorkbook();
FileOutputStream outputStream = new FileOutputStream("C:\\test.xlsx")) {
SXSSFSheet sheet = workbook.createSheet();
fillSheet(sheet);
String dataRange = new AreaReference(
new CellReference(0, 0),
new CellReference(NB_ROWS - 1, NB_COLS - 1))
.formatAsString();
CTTable cttable = workbook.getXSSFWorkbook()
.getSheetAt(0)
.createTable()
.getCTTable();
CTTableStyleInfo tableStyle = cttable.addNewTableStyleInfo();
tableStyle.setName("TableStyleMedium17");
cttable.setRef(dataRange);
cttable.setDisplayName("TABLE"); …Run Code Online (Sandbox Code Playgroud) 我想这将testfile将与Apache POI API(当前版本3-10决赛).以下测试代码
import java.io.FileInputStream;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ExcelTest {
public static void main(String[] args) throws Exception {
String filename = "testfile.xlsx";
XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(filename));
XSSFSheet sheet = wb.getSheetAt(0);
System.out.println(sheet.getFirstRowNum());
}
}
Run Code Online (Sandbox Code Playgroud)
导致第一行数为-1(现有行返回为null).测试文件由Excel 2010创建(我无法控制该部分),可以使用Excel读取而不会出现警告或问题.如果我使用我的Excel版本(2013)打开并保存文件,它可以按预期完美地读取.
我无法阅读原始文件或我如何能够获得的任何提示都受到高度赞赏.
我需要解析 Excel 工作表并从每一行检索值以将其存储在数据库中。目前我正在根据每个单元格所保存的值的类型来执行此操作。在当前情况下这是可以的,因为我只需要处理 2 列。但我有一个新的要求,需要解析包含超过 12 列的 Excel 工作表。这种情况下怎么办呢?如果我使用带有表头的结构化表,有没有办法可以根据列迭代每一行?
我当前的代码如下。
File file = new File(UPLOAD_LOCATION + fileUpload.getFile().getOriginalFilename());
FileInputStream excelFile = new FileInputStream(file);
Workbook workbook = new XSSFWorkbook(excelFile);
Sheet datatypeSheet = workbook.getSheetAt(0);
Iterator<Row> iterator = datatypeSheet.iterator();
while (iterator.hasNext()) {
Row currentRow = iterator.next();
Iterator<Cell> cellIterator = currentRow.iterator();
while (cellIterator.hasNext()) {
Cell currentCell = cellIterator.next();
// getCellTypeEnum shown as deprecated for version 3.15
// getCellTypeEnum ill be renamed to getCellType starting
// from version 4.0
if (currentCell.getCellTypeEnum() == CellType.STRING) {
System.out.print(currentCell.getStringCellValue() + …Run Code Online (Sandbox Code Playgroud)