I can take a stab at one of these. 

#1) Why does Conditional formatting use setBackgroundColor to set the fill 
color for Solid Fill while styles use setForgroundColor?

I noticed this discrepancy myself. To answer the question I generated a simple 
spreadsheet in MS Excel with one cell colored via style, and a second colored 
with a conditional format. It turned out that MS Excel uses Foreground Color 
for styles, and Background Color for conditional formats. I don't know why, and 
it only seems to apply to the Solid Fill pattern. For other fill patterns, 
Excel uses Foreground Color and Background Color consistently. You can validate 
this yourself. Create a simple spreadsheet with various fills using conditional 
formatting, and styles. Save it as an XSLX. Rename the resulting file to .ZIP, 
and look at the resulting XML. You will see the discrepancy. Why? I don't know, 
maybe ask on MSDN? MS is unlikely to fix this as it is pervasive at this point.

-----Original Message-----
From: Eric Douglas [mailto:edoug...@blockhouse.com] 
Sent: Tuesday, December 13, 2016 10:00 AM
To: POI Users List <user@poi.apache.org>
Subject: Re: How do you code cell striping?

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.addConditional
>> Formatting() 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