I found a PropertyTemplate class.  It is in the poi-3.16-beta1.jar.  It is
not in the 3.15 current download.

On Tue, Dec 20, 2016 at 11:44 AM, Murphy, Mark <murphym...@metalexmfg.com>
wrote:

> PropertyTemplate is new for 3.15. It is in package org.apache.poi.ss.util
>
> Here are the javadocs: https://poi.apache.org/
> apidocs/index.html?org/apache/poi/ss/util/PropertyTemplate.html
>
> Both PropertyTemplate and setCellStyleProperties() will help in reducing
> the number of styles generated. But neither will reduce the number of fills
> or boarders that are defined. That issue is deeper in the API. However, I
> have not seen nearly the number of boarders and fills defined as I have
> styles from using setCellStyleProperty(). You are right, the HashMap does
> not have all the CellStyle properties in it, just the ones you are trying
> to change. It uses a putAll() behind the scenes which does a merge with the
> existing cell's style.
>
> -----Original Message-----
> From: Eric Douglas [mailto:edoug...@blockhouse.com]
> Sent: Tuesday, December 20, 2016 10:23 AM
> To: POI Users List <user@poi.apache.org>
> Subject: Re: How do you code cell striping?
>
> Yeah that doesn't work.
> I wrote a test program that generates a .xlsx file and the borders section
> looks like this:
> <borders
> count="1"><border><left/><right/><top/><bottom/><
> diagonal/></border></borders>
>
> I change nothing except for adding this default border method:
>           BorderStyle DEFAULTBORDER = BorderStyle.HAIR;
>           Map<String, Object> properties = new HashMap<String, Object>();
>           // border around a cell
>           properties.put(CellUtil.BORDER_TOP, DEFAULTBORDER);
>           properties.put(CellUtil.BORDER_BOTTOM, DEFAULTBORDER);
>           properties.put(CellUtil.BORDER_LEFT, DEFAULTBORDER);
>           properties.put(CellUtil.BORDER_RIGHT, DEFAULTBORDER);
>           // Give it a color (AUTOMATIC)
>           properties.put(CellUtil.TOP_BORDER_COLOR,
> IndexedColors.AUTOMATIC.getIndex());
>           properties.put(CellUtil.BOTTOM_BORDER_COLOR,
> IndexedColors.AUTOMATIC.getIndex());
>           properties.put(CellUtil.LEFT_BORDER_COLOR,
> IndexedColors.AUTOMATIC.getIndex());
>           properties.put(CellUtil.RIGHT_BORDER_COLOR,
> IndexedColors.AUTOMATIC.getIndex());
> Then the call to that util under my cell:
>           r = curSheet.createRow(1);
>           c = r.createCell(0);
>           CellUtil.setCellStyleProperties(c, properties);
>
> Then the borders section looks like this:
> <borders
> count="9"><border><left/><right/><top/><bottom/><
> diagonal/></border><border><bottom
> style="hair"/></border><border><left style="hair"/><bottom
> style="hair"/></border><border><left style="hair"/><right
> style="hair"/><bottom style="hair"/></border><border><left
> style="hair"/><right style="hair"/><top style="hair"/><bottom
> style="hair"/></border><border><left style="hair"/><right
> style="hair"/><top style="hair"/><bottom style="hair"><color
> indexed="64"/></bottom></border><border><left style="hair"><color
> indexed="64"/></left><right style="hair"/><top style="hair"/><bottom
> style="hair"><color indexed="64"/></bottom></border><border><left
> style="hair"><color indexed="64"/></left><right style="hair"><color
> indexed="64"/></right><top style="hair"/><bottom style="hair"><color
> indexed="64"/></bottom></border><border><left style="hair"><color
> indexed="64"/></left><right style="hair"><color indexed="64"/></right><top
> style="hair"><color indexed="64"/></top><bottom style="hair"><color
> indexed="64"/></bottom></border></borders>
>
> That method example also creates a new HashMap, so it's not pulling sheet
> defaults.  The font on that cell is different from the other cells.
>
> The next method described on that page references a PropertyTemplate.  I
> Googled that and found org.apache.poi.ss.util.PropertyTemplate, searched
> that and found POI 3.9.  Whatever that was appears to be gone in POI 3.15.
>
> On Mon, Dec 19, 2016 at 10:57 PM, Mark Murphy <jmarkmur...@gmail.com>
> wrote:
>
> > BTW, if you look at the quick guide
> > https://poi.apache.org/spreadsheet/quick-guide.html#CellProperties you
> > will find two methods of drawing borders without creating all those
> > unused intermediate styles.
> >
> > On Mon, Dec 19, 2016 at 4:04 PM, Eric Douglas
> > <edoug...@blockhouse.com>
> > wrote:
> >
> > > Yeah, I wouldn't expect really fast response from a list like this.
> > > My previous message was 6 days ago.
> > > I didn't see an easy way to get alternate row styling with regular
> > > styles (to color only even numbered rows, and keep only even
> > > numbered rows
> > colored
> > > if the user sorts by a different column) but I did get the
> > > conditional formatting working.  The bad part is the order of
> > > precedence.  The application applies the individual cell colors then
> > > the conditional format.  I wanted cell colors in the individual cell
> > > styles to override
> > the
> > > conditional.  The only thing I've found that I think would work is
> > coding a
> > > VBA method into the conditional formatting to tell the
> > > "ISEVEN(ROW())" to apply only if the cell does not already have
> > > individual coloring, but the syntax for applying VBA sounds ugly.
> > >
> > > I did unzip some xlsx files and read through the schema and we can
> > > easily see why some people send us really large files.  Saving
> > > spreadsheets from LibreOffice wants to write a lot of styles it
> > > doesn't need.  Some just
> > code
> > > duplicate styles and end up with hundreds or thousands, where I got
> > > mine only writing unique so there's about 11.  Some of the POI API
> > > doesn't
> > make
> > > sense, as I tried to apply a thin border around every populated cell
> > > and ended up with 9 border styles, with cell styles only referencing
> > > 3 of
> > them.
> > > ie:
> > >
> > > <borders count="9"><border><left style="hair"><color
> > > auto="true"/></left><right style="hair"><color
> > > auto="true"/></right><top style="hair"><color
> > > auto="true"/></top><bottom style="hair"><color
> > > auto="true"/></bottom><diagonal/></border><border><bottom
> > > style="hair"/></border><border><left style="hair"/><bottom
> > > style="hair"/></border><border><left style="hair"/><right
> > > style="hair"/><bottom style="hair"/></border><border><left
> > > style="hair"/><right style="hair"/><top style="hair"/><bottom
> > > style="hair"/></border><border><left style="hair"/><right
> > > style="hair"/><top style="hair"/><bottom style="hair"><color
> > > indexed="64"/></bottom></border><border><left style="hair"><color
> > > indexed="64"/></left><right style="hair"/><top style="hair"/><bottom
> > > style="hair"><color indexed="64"/></bottom></border><border><left
> > > style="hair"><color indexed="64"/></left><right style="hair"><color
> > > indexed="64"/></right><top style="hair"/><bottom style="hair"><color
> > > indexed="64"/></bottom></border><border><left style="hair"><color
> > > indexed="64"/></left><right style="hair"><color
> > indexed="64"/></right><top
> > > style="hair"><color indexed="64"/></top><bottom style="hair"><color
> > > indexed="64"/></bottom></border></borders>
> > >
> > > <cellStyleXfs count="8"><xf numFmtId="0" fontId="0" fillId="0"
> > > borderId="0"/><xf borderId="0" fillId="0" fontId="0" numFmtId="0"
> > > xfId="1"/><xf borderId="0" fillId="0" fontId="0" numFmtId="0"
> > xfId="2"/><xf
> > > borderId="0" fillId="0" fontId="0" numFmtId="0" xfId="3"/><xf
> > borderId="0"
> > > fillId="0" fontId="0" numFmtId="0" xfId="4"/><xf borderId="0"
> fillId="0"
> > > fontId="0" numFmtId="0" xfId="5"/><xf borderId="0" fillId="0"
> fontId="0"
> > > numFmtId="0" xfId="6"/><xf borderId="0" fillId="0" fontId="0"
> > numFmtId="0"
> > > xfId="7"/></cellStyleXfs>
> > >
> > > <cellXfs count="8"><xf numFmtId="0" fontId="0" fillId="0" borderId="4"
> > > xfId="0" applyFont="true" applyBorder="true"><alignment
> > > horizontal="left"/></xf><xf xfId="1" borderId="8" fillId="5" fontId="0"
> > > numFmtId="0" applyBorder="true" applyNumberFormat="true"
> applyFill="true"
> > > applyFont="true"><alignment horizontal="left" textRotation="0"
> > > vertical="bottom" wrapText="false"/><protection
> > > locked="true"/></xf><xf xfId="2" borderId="8" fillId="5" fontId="0"
> numFmtId="0"
> > applyBorder="true"
> > > applyNumberFormat="true" applyFill="true"
> > > applyFont="true"><alignment horizontal="center" textRotation="0"
> vertical="bottom"
> > > wrapText="false"/><protection locked="true"/></xf><xf xfId="3"
> > borderId="8"
> > > fillId="3" fontId="0" numFmtId="0" applyBorder="true"
> > > applyNumberFormat="true" applyFill="true"
> > > applyFont="true"><alignment horizontal="left" textRotation="0"
> vertical="bottom"
> > > wrapText="false"/><protection locked="true"/></xf><xf xfId="4"
> > borderId="8"
> > > fillId="2" fontId="0" numFmtId="164" applyBorder="true"
> > > applyNumberFormat="true" applyFill="true"
> > > applyFont="true"><alignment horizontal="left" textRotation="0"
> vertical="bottom"
> > > wrapText="false"/><protection locked="true"/></xf><xf xfId="5"
> > borderId="8"
> > > fillId="3" fontId="0" numFmtId="165" applyBorder="true"
> > > applyNumberFormat="true" applyFill="true"
> > > applyFont="true"><alignment horizontal="left" textRotation="0"
> vertical="bottom"
> > > wrapText="false"/><protection locked="true"/></xf><xf xfId="6"
> > borderId="8"
> > > fillId="3" fontId="0" numFmtId="165" applyBorder="true"
> > > applyNumberFormat="true" applyFill="true"
> > > applyFont="true"><alignment horizontal="right" textRotation="0"
> vertical="bottom"
> > > wrapText="false"/><protection locked="true"/></xf><xf xfId="7"
> > borderId="8"
> > > fillId="2" fontId="0" numFmtId="165" applyBorder="true"
> > > applyNumberFormat="true" applyFill="true"
> > > applyFont="true"><alignment horizontal="right" textRotation="0"
> vertical="bottom"
> > > wrapText="false"/><protection locked="true"/></xf></cellXfs>
> > >
> > > The conditional formatting ends up in sheet1.xml after the
> > > sheetData,
> > and I
> > > coded an option to skip heading rows:
> > > <conditionalFormatting sqref="A1:AMJ1048576"><cfRule type="expression"
> > > dxfId="0"
> > > priority="1"><formula>AND(ISEVEN(ROW()),ROW()>1)</formula></cfRule><
> > > /
> > > conditionalFormatting>
> > > which of course links to dxf in the styles.xml <dxfs
> > > count="1"><dxf><fill><patternFill patternType="solid"><bgColor
> > > rgb="E4F7F7"/></patternFill></fill></dxf></dxfs>
> > >
> > > On Mon, Dec 19, 2016 at 3:36 PM, Javen O'Neal <one...@apache.org>
> wrote:
> > >
> > > > I think there's a way to apply alternate row styling within
> > > > regular
> > > styles
> > > > (not conditional formatting), but have never used POI to do this.
> > Rather
> > > > than tell you the wrong answer, I'd rather stay quiet to avoid
> > > unnecessary
> > > > confusion. Read through the OOXML schemas or create a file in
> > > > Excel
> > with
> > > > alternate row styling, unzip the xlsx file, and read the XML to
> > > > figure
> > > out
> > > > how POI needs to create the same file.
> > > >
> > > > > How many POI developers actively monitor this list?
> > > > At least half a dozen. Nick is one of them.
> > > > Some of us don't live in your timezone, so same-day responses are
> > > unlikely.
> > > > We use a minimum window of 72 hours whenever we vote on a release.
> > > >
> > > > Not all of us are experts at the feature you're needing help with,
> > > > conditional formatting, which may be another reason for low response.
> > > >
> > > > We volunteer our time, working on POI between our day jobs and
> > > > personal lives. Given the holiday season is close, I would expect
> > > > developers to
> > be
> > > > particularly busy, finishing projects at work before the holiday
> > closure
> > > > and preparing for travel to relatives.
> > > >
> > > > Personally, I spend less time on POI when work at my day job gets
> busy.
> > > > This is to avoid coming down with a cold due to lack of sleep or
> > > prolonged
> > > > stress, or burning out.
> > > >
> > > > We appreciate your patience.
> > > >
> > > > On Dec 19, 2016 11:24, "Eric Douglas" <edoug...@blockhouse.com>
> wrote:
> > > >
> > > > How many POI developers actively monitor this list?  I haven't
> > > > gotten
> > any
> > > > answers to those questions.
> > > > Meanwhile I have a new question.  If I create a conditional
> > > > formatting which is linked to the entire document and colors every
> > > > other row, how
> > > can
> > > > I get individual colors in cell styles to override that, or how
> > > > can I
> > get
> > > > the conditional formatting to only color cells that have no color
> > > > in
> > > their
> > > > individual cell styles?
> > > >
> > > > On Tue, Dec 13, 2016 at 9:59 AM, Eric Douglas
> > > > <edoug...@blockhouse.com
> > >
> > > > wrote:
> > > >
> > > > > So I took another stab at it.  This seems to work, but I have
> > > questions.
> > > > >
> > > > > import java.awt.Color;
> > > > > import java.io.File;
> > > > > import java.io.FileOutputStream; import java.io.IOException;
> > > > >
> > > > > import org.apache.poi.ss.usermodel.ConditionalFormattingRule;
> > > > > import org.apache.poi.ss.usermodel.FillPatternType;
> > > > > import org.apache.poi.ss.usermodel.PatternFormatting;
> > > > > import org.apache.poi.ss.usermodel.SheetConditionalFormatting;
> > > > > import org.apache.poi.ss.util.CellRangeAddress;
> > > > > import org.apache.poi.xssf.usermodel.XSSFCell;
> > > > > import org.apache.poi.xssf.usermodel.XSSFCellStyle;
> > > > > import org.apache.poi.xssf.usermodel.XSSFColor;
> > > > > import org.apache.poi.xssf.usermodel.XSSFSheet;
> > > > > import org.apache.poi.xssf.usermodel.XSSFWorkbook;
> > > > >
> > > > > public class TestExcel {
> > > > >
> > > > >      public static void main(String[] args) throws IOException {
> > > > >           XSSFWorkbook wb = new XSSFWorkbook();
> > > > >           XSSFSheet curSheet = wb.createSheet("Sheet " +
> > > > > (wb.getNumberOfSheets() + 1));
> > > > >           XSSFCell c1 = curSheet.createRow(0).createCell(0);
> > > > >           c1.setCellValue(wb.getCreationHelper().
> > > > createRichTextString("No
> > > > > color"));
> > > > >           XSSFCell c2 = curSheet.createRow(1).createCell(0);
> > > > >           c2.setCellValue(wb.getCreationHelper().
> > > > createRichTextString("Color
> > > > > this cell"));
> > > > >           XSSFCell c3 = curSheet.createRow(2).createCell(0);
> > > > >           c3.setCellValue(wb.getCreationHelper().
> > > > createRichTextString("No
> > > > > color"));
> > > > >           XSSFCell c4 = curSheet.createRow(3).createCell(0);
> > > > >           c4.setCellValue(wb.getCreationHelper().
> > > > createRichTextString("Color
> > > > > this cell"));
> > > > >           // set one cell's color
> > > > >           final XSSFCellStyle style1 = wb.createCellStyle();
> > > > >           style1.setFillForegroundColor(new XSSFColor(new
> > > > > Color(123,124,125)));
> > > > >           style1.setFillPattern(FillPatternType.SOLID_FOREGROUND);
> > > > >           c4.setCellStyle(style1);
> > > > >           // set all cells' color, every other row
> > > > >           CellRangeAddress[] regions =
> {CellRangeAddress.valueOf("A1:
> > > > > AMJ1048576")};
> > > > >           SheetConditionalFormatting sheetCF = curSheet.
> > > > > getSheetConditionalFormatting();
> > > > >           ConditionalFormattingRule rule1 = sheetCF.
> > > > > createConditionalFormattingRule("ISEVEN(ROW())");
> > > > >           PatternFormatting fill1 = rule1.createPatternFormatting(
> );
> > > > >           final XSSFColor customColor = new XSSFColor(new
> > > > > Color(228,
> > > 247,
> > > > > 247));
> > > > >           fill1.setFillBackgroundColor(customColor);
> > > > >           fill1.setFillPattern(PatternFormatting.SOLID_
> FOREGROUND);
> > > > >           sheetCF.addConditionalFormatting(regions, rule1);
> > > > >           File fi = new File("output.xlsx");
> > > > >           if (fi.exists()) {
> > > > >                fi.delete();
> > > > >           }
> > > > >           FileOutputStream output = new FileOutputStream(fi);
> > > > >           wb.write(output);
> > > > >           wb.close();
> > > > >           output.flush();
> > > > >           output.close();
> > > > >      }
> > > > > }
> > > > >
> > > > > 1) Why does it change the background of one cell using
> > > > > setFillForegroundColor, but to change the background of many
> > > > > cells
> > > with a
> > > > > condition I have to call setFillBackgroundColor??
> > > > > 2) Why does this create a generic format?  When I call
> > > > > createPatternFormatting() it shows up in the LibreOffice Calc
> > > > > Styles
> > > and
> > > > > Formatting section as ConditionalStyle_1.  Can I name this style?
> > > > > 3) Why does this look like a regular style in the Calc program
> > > > > with
> > > many
> > > > > attributes I can set, but the API only allows me to set the fill
> > color?
> > > > >
> > > > > On Mon, Dec 12, 2016 at 4:33 PM, Nick Burch
> > > > > <apa...@gagravarr.org>
> > > > wrote:
> > > > >
> > > > >> On Mon, 12 Dec 2016, Eric Douglas wrote:
> > > > >>
> > > > >>> I found one sample that shows how to code the condition using
> > > > >>> org.apache.poi.ss.usermodel.SheetConditionalFormatting.
> > > > addConditionalFormatting()
> > > > >>> to put in the formula that would color each cell if it's in an
> > > > >>> even numbered row, but I'm having trouble figuring out the API
> > > > >>> to apply
> > > the
> > > > >>> formula to every cell on the worksheet.
> > > > >>>
> > > > >>
> > > > >> For every cell on a sheet, just give a cellrangeaddress that
> > > > >> covers
> > > the
> > > > >> whole extent
> > > > >>
> > > > >> For every formula cell, you'd need to loop over all cells
> > > > >> checking
> > the
> > > > >> cell type, then add just those
> > > > >>
> > > > >> Nick
> > > > >>
> > > > >> ------------------------------------------------------------
> > ---------
> > > > >> To unsubscribe, e-mail: user-unsubscr...@poi.apache.org For
> > > > >> additional commands, e-mail: user-h...@poi.apache.org
> > > > >>
> > > > >>
> > > > >
> > > >
> > >
> >
>

Reply via email to