我正在尝试使用Apache POI
更改整个Excel工作簿(XSSF
)的默认单元格样式。这应该应用于用户可能创建的新单元格(在POI
保存工作簿之后)。我试图通过调用workbook.getCellStyleat(0)
--我认为这是工作簿的默认样式--来实现这一点,然后将此样式修改为我想要的新默认样式。
当我读入一个现有的xslx
文件(一个“模板”文件)并修改默认样式时,这会起作用。但是,当我使用POI
从头创建一个新的XSLX
文件时,它就不起作用了。
当使用调试器单步执行时,我可以看到,当使用“模板”文件时,有一个“主题”分配给索引0处的单元格样式(可能是因为模板文件最初是使用Excel创建的)。但是在从头创建文件时(使用poi
),索引为0的单元格样式具有空主题。(这可能是使用一种方法而不是另一种方法的原因之一。)
对于如何可靠地更改工作簿(XSSF
)的默认单元格样式,无论工作簿最初是如何创建的,有什么建议吗?谢谢!
使用XSSF实现这一点有两种可能。
首先:如果在Excel中选择XSSF工作表中的所有单元格并对其应用样式,则会将cols
元素添加到工作表中,并为所有列提供样式定义:
<cols>
<col min="1" max="16384" style="1"/>
</cols>
这可以通过apache poi实现,如下所示:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
import java.io.FileOutputStream;
import java.io.IOException;
class ExcelCellStyleAllColumns
{
public static void main(String[] args) {
try {
Workbook wb = new XSSFWorkbook();
Font font = wb.createFont();
font.setFontHeightInPoints((short)24);
font.setFontName("Courier New");
font.setItalic(true);
font.setBold(true);
CellStyle style = wb.createCellStyle();
style.setFont(font);
Sheet sheet = wb.createSheet();
org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCol cTCol =
((XSSFSheet)sheet).getCTWorksheet().getColsArray(0).addNewCol();
cTCol.setMin(1);
cTCol.setMax(16384);
cTCol.setWidth(12.7109375);
cTCol.setStyle(style.getIndex());
Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
cell.setCellValue("test");
cell.setCellStyle(style);
FileOutputStream os = new FileOutputStream("ExcelCellStyleAllColumns.xlsx");
wb.write(os);
os.close();
} catch (IOException ioex) {
}
}
}
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
import java.io.FileOutputStream;
import java.io.IOException;
class ExcelDefaultCellStyle {
public static void main(String[] args) {
try {
Workbook wb = new XSSFWorkbook();
Font font = wb.getFontAt((short)0);
font.setFontHeightInPoints((short)24);
font.setFontName("Courier New");
((XSSFFont)font).setFamily(3);
((XSSFFont)font).setScheme(FontScheme.NONE);
font.setItalic(true);
font.setBold(true);
CellStyle style = wb.getCellStyleAt(0);
style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
style.setWrapText(true);
((XSSFWorkbook) wb).getStylesSource().getCTStylesheet().addNewCellStyles().addNewCellStyle().setXfId(0);
((XSSFCellStyle)style).getStyleXf().addNewAlignment().setVertical(
org.openxmlformats.schemas.spreadsheetml.x2006.main.STVerticalAlignment.CENTER);
((XSSFCellStyle)style).getStyleXf().getAlignment().setWrapText(true);
Sheet sheet = wb.createSheet();
Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
cell.setCellValue("test");
FileOutputStream os = new FileOutputStream("ExcelDefaultCellStyle.xlsx");
wb.write(os);
os.close();
} catch (IOException ioex) {
}
}
}
styles.XML
中的XML显示:
<cellStyleXfs count="1">
<xf numFmtId="0" fontId="0" fillId="0" borderId="0">
<alignment vertical="center" wrapText="true"/>
</xf>
</cellStyleXfs>
<cellXfs count="1">
<xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0">
<alignment vertical="center" wrapText="true"/>
</xf>
</cellXfs>
<cellStyles>
<cellStyle xfId="0"/>
</cellStyles>
如您所见,普通单元格样式是cellstyles
中的第一个。它指的是xfid=“0”
,它指的是numfmtid=“0”
fontid=“0”
fillid=“0”
borderid=“0”
。这意味着数字格式、字体、填充格式和边框的最早定义是在普通单元格样式中使用的。
我遇到了奇怪的问题与.NET版本的POI库为Excel电子表格。我正在重写从文本文件到Excel97-2003文档,我想添加一些格式,以编程方式,依赖于一些在程序的乞求下收集的值。 一开始,在我根据给定值创建一个新单元格的方法中,我也创建了一个新的工作簿CellStyle,这是错误的,因为我很快就用完了这些样式(或者我只是认为这是问题的原因)。 负责Excel工作簿的类的构造函数: 长话短说,在F
我想将工作簿的一页(包括样式)复制到新的工作簿。 我尝试对所有单元格进行迭代 抛出java.lang.IllegalStateException:超出了单元格样式的最大数目。在.xls工作簿中最多可以定义4000个样式 抛出java.lang.IllegalArgumentException:此样式不属于提供的工作簿。是否尝试将样式从一个工作簿分配到另一个工作簿的单元格? 正确的样式复制方法是什么
问题内容: 是否可以在Eclipse 3.4.1中设置默认的工作目录?默认情况下是: $ {workspace_loc :(项目名称)} 但我希望它像 $ {custom_var} 对于每个类,我可以将运行配置->参数->工作目录更改为“其他”,但最好更改默认值。我有很多需要从该特定目录运行的类。 问题答案: 您可以做的一件事是设置一个启动配置,然后右键单击它,然后选择“重复”。这将保留所有参数。
这里的术语“工作簿”表示Microsoft Excel文件。 完成本章后,您将能够使用Java程序创建新的工作簿并打开现有的工作簿。 创建空白工作簿 以下简单程序用于创建空白Microsoft Excel工作簿。 import java.io.*; import org.apache.poi.xssf.usermodel.*; public class CreateWorkBook { pu
所以在问这个之前,我搜索并发现了一些与我在这里想要做的相似的事情。 基本上我有工作簿AlphaMaster。这个工作簿是一个模板,我想用它来创建每周的新工作簿。 在本工作簿中,有名为“周一至周六”的工作表,以及带有相应日期的周一、周二等其他工作表。 我创建了一个在打开工作簿时加载的表单。我想要的是当我单击表单运行时,它将: > 将代码保存模板作为新工作簿运行 根据userform1的输入重命名工作
当将许多Excel文件与aspose组合在一起时,我得到的是单个工作簿(包含许多工作表的Excel文件)。但问题是我没有得到HTML样式(颜色,字体,大小背景颜色...)合并前的每个工作表中都有。 下面是我的java代码: 我不知道是否有一个选项使aspose在组合工作簿时考虑到样式?