https://issues.apache.org/bugzilla/show_bug.cgi?id=46664

--- Comment #19 from ogawa <[email protected]> 2011-02-10 02:40:16 EST ---
I found a difference HSSFWorkbook and XSSFWorkbook.

In XSSFWorkbook#setPrintArea(), FormulaParser#parse() is called as follows.

FormulaParser.parse (formulaText, fpb, FormulaType.NAMEDRANGE, getSheetIndex
());

The third argument is FormulaType.NAMEDRANGE.

However, in HSSFWorkbook#setPrintArea(), third argument is FormulaType.CELL as
follows.

HSSFFormulaParser.parse (sb.toString (), this, FormulaType.CELL, sheetIndex)

In fact, if I create a following class, setPrintArea works fine.

--------------------------------------------------------------------------------

import java.lang.reflect.Field;
import java.util.regex.Pattern;

import org.apache.poi.hssf.model.HSSFFormulaParser;
import org.apache.poi.hssf.model.Workbook;
import org.apache.poi.hssf.record.NameRecord;
import org.apache.poi.hssf.record.formula.SheetNameFormatter;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.formula.FormulaType;

public class MyHSSFWorkbook extends HSSFWorkbook {

    private static final Pattern COMMA_PATTERN = Pattern.compile(",");
    private Workbook workbook;

    public MyHSSFWorkbook() throws NoSuchFieldException, IllegalAccessException
{
        this.workbook = getLowLevelWorkbook();
    }

    private Workbook getLowLevelWorkbook() throws NoSuchFieldException,
IllegalAccessException {
        Field field = HSSFWorkbook.class.getDeclaredField("workbook");
        field.setAccessible(true);
        return (Workbook) field.get(this);
    }

    @Override
    public void setPrintArea(int sheetIndex, String reference) {
        NameRecord name =
               
workbook.getSpecificBuiltinRecord(NameRecord.BUILTIN_PRINT_AREA, sheetIndex +
1);

        if (name == null) {
            name = workbook.createBuiltInName(NameRecord.BUILTIN_PRINT_AREA,
sheetIndex + 1);
            // adding one here because 0 indicates a global named region;
doesn't make sense for print areas
        }
        String[] parts = COMMA_PATTERN.split(reference);
        StringBuffer sb = new StringBuffer(32);
        for (int i = 0; i < parts.length; i++) {
            if (i > 0) {
                sb.append(",");
            }
            SheetNameFormatter.appendFormat(sb, getSheetName(sheetIndex));
            sb.append("!");
            sb.append(parts[i]);
        }
        // FormulaType.CELL -> FormulaType.NAMEDRANGE
        name.setNameDefinition(HSSFFormulaParser.parse(sb.toString(), this,
FormulaType.NAMEDRANGE,
            sheetIndex));
    }
}

--------------------------------------------------------------------------------

Is this a bug?

-- 
Configure bugmail: https://issues.apache.org/bugzilla/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to