Glad that you replied and happy the code worked although I admit that the
colouring problem is quite confusing - have we hit that same problem where
Excel is reporting the colour index of 64 - automatic - again? Anyway, since
I last posted, I have dug around in the API a bit further and found a
contribution made by another developer called CellUtil. It does everything -
at least I think it does as I have not had the chance to play with it yet -
that we have been trying to achieve. I think it could be worth your having a
look at before finally nailing down the design of your code.
Yours
Mark B
yehogold wrote:
>
> Hi.
>
> I tried your code and the pooling function worked very well.
> Unfortunately, it still produced the odd looking cells. I now think that
> the problem is not cloning within a workbook, it is in how a the AUTOMATIC
> color is cloned.
>
> Because of all the problems I seem to be having with this, I decided to
> change the marking from changing the background and shading to changing
> font's style. I am still using your method for pooling, however. It is
> very useful and should perhaps be cleaned up and submitted to POI to be
> included in the interface.
>
> Thank you for all your help,
>
> yehogold
>
>
>
> MSB wrote:
>>
>> This morning, I had the chance to play around with some code and feel
>> that I may, that is MAY, have found a way forward. Please find attached
>> some code that I hope will explain what I am trying to do. It has been
>> targetted at the HSSF stream but I think that it will be quite easy to
>> modify it to work with the 'ss' classes; in one way, it is halfway there
>> as I am using Iterators to get at the cells on the sheet.
>>
>> Perhaps the first aspect to take a look at is what I am doing with the
>> cell styles. As you will be able to see, I have chosen not to use the
>> cloneStyleFrom() method because you will be copying/cloning styles WITHIN
>> a workbook rather than between workbooks. As a result, lots of problems
>> are removed and so it is easier and better - for reasons I will explain
>> below - to not use the cloneStyleFrom() method here.
>>
>> The reason I have written my own method to copy/clone the styles is that
>> I want to avoid adding styles into the workbook if a style with the
>> required attributes already exists. As a result of this decision, I have
>> implemented style pooling using a Hashtable to organise and manage the
>> styles for me. When the time arrives to 'modify' a cells style, this
>> Hashtable is checked to see if it contains one with the required set of
>> attributes. If it does, then this style will be reused and if the pool
>> does not contain a suitable style, a new one is created, written away to
>> the Hashtable and then returned for use.
>>
>> The equals() method is overridden in both of the concrete implementations
>> of CellStyle (XSSFCellStyle and HSSCellStyle) so one option might have
>> been to hold the styles in an ArrayList rather than a Hashtable and
>> simply step through looking for a match using the equals method. The
>> problem with this is that it again means actually creating the style
>> object we want in order to perform the tests. To create the style means
>> adding it to the workbook and I cannot find a way to remove it once it
>> has been added; though I suspect there is a way using indices.
>>
>> So, I am going to use the Hashtable approach and have everything keyed on
>> a long String. As you can see, if you look at the getStyleKeyMethod(), I
>> am simply creating a delimited list containing the values of the styles
>> various attributes - boolean values are converted into a short, 1 for
>> true and 0 for false. Once assembled, this String is both the 'signature'
>> for the style and the key for the Hashtable holding 'all' - well, any we
>> create explicitly - of the sheets styles. Checking simply consists of
>> interrogating the style to create this String and using that as the key
>> in a call to the Hashtable's contains() method. Creating the style if a
>> new one is required can also be accomplished from this String; simply
>> strip it apart, convert each element back to a sort or boolean value and
>> use that to set an attribute of the new style.
>>
>> Testing had to be quite quick for me this morning - autumn is drawing on,
>> the garden is calling and for once, it is NOT raining - but I think this
>> approach could be promising. There are two points that do concern me
>> currently. The first concerns format strings and I need to dig around
>> further to make sure that it is possible to recover and reset these
>> correctly. The second concerns the delimiter character that is used to
>> separate items in the attribute String. Currently, I am using a comma but
>> can see that may cause problems in locales where this is the decimal
>> separator and if we start to copy and re-use formatting Strings as it
>> could well appear in one of those. I have tested a few other characters
>> and discovered that the split() method is not willing to use them all but
>> I feel that this may be more a problem with my understanding of regular
>> expressions than anyting else. Secondly, I am not testing to see if the
>> cells existing style ought to be replaced as you do in your code; rather
>> my example simply replaces the style of the cell with the one I have
>> prescribed regardless. However, I am confident you can see what to change
>> to add the extra check in and so I will not bother making that change.
>>
>> With all of that said, here is the code - forgive me please as it is very
>> messy being test code and all that.
>>
>> public class CopyCloneTest {
>>
>> // Will need to experiment to find a 'safe' separator.
>> private static final String SEPARATOR = ",";
>>
>> /**
>> * Test code written to see if it is possible to cahnge the style
>> applied to
>> * a cell.
>> *
>> * @param filename A String encapsulating the name of and path to a
>> Word
>> * document. Currently, the code operates
>> successfully on
>> * binary (OLE2CDF) format files with the .doc or
>> .dot
>> * extensions.
>> * @throws java.io.IOException Thrown if a problem occurs within the
>> * underlying file system whilst reading
>> from
>> * or writing to the file.
>> * @throws java.io.FileNotFoundException Thrown if the Word document
>> cannot
>> * be located.
>> */
>> public void cloneTest(String filename) throws IOException,
>> FileNotFoundException {
>> File file = null;
>> FileInputStream fis = null;
>> FileOutputStream fos = null;
>> HSSFWorkbook workbook = null;
>> HSSFSheet sheet = null;
>> Hashtable<String, HSSFCellStyle> stylesCollection = null;
>> Iterator<Row> rowIter = null;
>> Iterator<Cell> cellIter = null;
>> Row row = null;
>> Cell cell = null;
>> HSSFCell hssfCell = null;
>> try {
>> // Instantiate the Hashtbale. This will contain all of the
>> styles
>> // that we create.
>> stylesCollection = new Hashtable<String, HSSFCellStyle>();
>>
>> // Open the workbook and then get the first sheet. Of course,
>> it
>> // would be straightforward to modify this so that each sheet
>> // were recovered from the workbook and processed in turn.
>> file = new File(filename);
>> fis = new FileInputStream(file);
>> workbook = new HSSFWorkbook(fis);
>> fis.close();
>> fis = null;
>> sheet = workbook.getSheetAt(0);
>>
>> // Recover an Iterator to step through the rows the sheet
>> contains.
>> rowIter = sheet.rowIterator();
>> while(rowIter.hasNext()) {
>> row = rowIter.next();
>>
>> // From the row, get an Iterator to step through the
>> cells the
>> // rows contain.
>> cellIter = row.cellIterator();
>> while(cellIter.hasNext()) {
>> cell = cellIter.next();
>>
>> // Note the cast here from Cell to HSSFCell. The code
>> // may be changed so that it takes and works with
>> Cells
>> // quite easilly.
>> hssfCell = (HSSFCell)cell;
>>
>> // This is the heart of it all really. The
>> copyStyle()
>> // method takes care of recovering the attributes
>> from the
>> // cells current style, including the changes
>> required - in
>> // this case limited to the background colour,
>> foreground
>> // colour and fill pattern in that order.
>> hssfCell.setCellStyle(copyStyle(workbook,
>> hssfCell.getCellStyle(),
>> stylesCollection,
>> HSSFColor.WHITE.index,
>> HSSFColor.LIGHT_BLUE.index,
>> HSSFCellStyle.THIN_FORWARD_DIAG));
>> }
>> }
>> // Save the workbook away.
>> fos = new FileOutputStream(file);
>> workbook.write(fos);
>> }
>> finally {
>> if(fis != null) {
>> try {
>> fis.close();
>> fis = null;
>> }
>> catch(IOException ioEx) {
>> // I G N O R E
>> }
>> }
>> if(fos != null) {
>> try {
>> fos.close();
>> fos = null;
>> }
>> catch(IOException ioEx) {
>> // I G N O R E
>> }
>> }
>> }
>> }
>>
>> /**
>> * Checks to see whether a style with the required set of attributes
>> has
>> * already been created. If so, it will return a reference to that
>> style, if
>> * not, it will create and return a new style object with the
>> required
>> * attributes.
>> *
>> * Note: I did not make this method static for any technical reason,
>> just to
>> * make playing with the code alittle easier. Also note that the
>> first
>> * parameter is a reference to a workbook; this must be the workbook
>> the
>> * cell was originally recovered from as this method of copying
>> styles will
>> * work ONLY if a single workbook is involved. Depending on where you
>> sit
>> * along the 'cohesion' versus 'coupling' continuum, more that one of
>> these
>> * parameter could be removed; if, for example, the workbook and
>> * stylesCollection Hashtable were private instance variables and the
>> method
>> * was NOT static, then these parameters could be removed and the
>> variables
>> * directly accessed.
>> *
>> * @param workbook The workbook from which the cell was recovered.
>> * @param originalCellStyle The style object recovered from a cell.
>> * @param stylesCollection A Hashtable that contains the collection
>> of
>> * styles created for use within the
>> workbook.
>> * @param backgroundColour A primitive short containing the index of
>> the
>> * required/desired background colour for the
>> cell.
>> * @param foregroundColour A primitive short containing the index of
>> the
>> * required/desired foreground colour for the
>> cell.
>> * @param fillPattern A primitive short containing the index of the
>> * required/desired fill patter for the cell.
>> * @return A cell style either recovered from the collection or newly
>> * created that encapsulates the required set of attributes.
>> */
>> private static HSSFCellStyle copyStyle(HSSFWorkbook workbook,
>> HSSFCellStyle originalCellStyle, Hashtable<String,
>> HSSFCellStyle> stylesCollection, short backgroundColour,
>> short foregroundColour, short fillPattern) {
>> HSSFCellStyle cellStyle = null;
>> // Convert the styles attributes into a delimited String; note
>> that
>> // this is the stage where the required changes to the background
>> // colour, foreground colour and fill pattern are specified.
>> String styleKey = getStyleKey(originalCellStyle,
>> backgroundColour,
>> foregroundColour, fillPattern);
>>
>> // If the styles collection contains a suitable style, return
>> that.
>> if(stylesCollection.contains(styleKey)) {
>> cellStyle = stylesCollection.get(styleKey);
>> }
>> else {
>> // If not, create a new style within the workbook.
>> cellStyle = workbook.createCellStyle();
>>
>> // Set that styles attributes and add it to the collection.
>> setStyleAttributes(workbook, cellStyle, styleKey);
>> stylesCollection.put(styleKey, cellStyle);
>> }
>> return(cellStyle);
>> }
>>
>> /**
>> * Set the attributes for the cell style.
>> *
>> * @param workbook A reference to the workbook that contains the
>> cell.
>> * Required only to convert the font's index into an
>> * instance of the HSSFFont class to successfully set
>> that
>> * attributes. Again, the comments made with regard
>> to
>> * coupling, cohesion and static methods applies as
>> it did
>> * above.
>> * @param cellStyle The cell style whose attributes are to be set.
>> * @param styleAttributes An instance of the String class
>> encapsulating a
>> * comma delimited String that contains the
>> set of
>> * attributes for a style.
>> * @throws java.lang.IllegalArgumentException Thrown if the number of
>> * attribute values
>> recovered
>> * from the styleAtributes
>> * parameter is
>> 'incorrect'.
>> */
>> private static void setStyleAttributes(HSSFWorkbook workbook,
>> HSSFCellStyle cellStyle, String styleAttributes)
>> throws
>> IllegalArgumentException {
>> String[] attrArray = styleAttributes.split(SEPARATOR);
>> if(attrArray.length != 20 ) {
>> throw new IllegalArgumentException("Incorrect number of" +
>> " style attributes.");
>> }
>> cellStyle.setAlignment(Short.valueOf(attrArray[0]));
>> cellStyle.setBorderBottom(Short.valueOf(attrArray[1]));
>> cellStyle.setBorderLeft(Short.valueOf(attrArray[2]));
>> cellStyle.setBorderRight(Short.valueOf(attrArray[3]));
>> cellStyle.setBorderTop(Short.valueOf(attrArray[4]));
>> cellStyle.setBottomBorderColor(Short.valueOf(attrArray[5]));
>> cellStyle.setDataFormat(Short.valueOf(attrArray[6]));
>>
>> // Javadoc stipulates setting foreground before background.
>> cellStyle.setFillForegroundColor(Short.valueOf(attrArray[8]));
>> cellStyle.setFillBackgroundColor(Short.valueOf(attrArray[7]));
>>
>> cellStyle.setFillPattern(Short.valueOf(attrArray[9]));
>>
>> cellStyle.setFont(workbook.getFontAt(Short.valueOf(attrArray[10])));
>> // Convert from numeric value to boolean
>> cellStyle.setHidden(Short.valueOf(attrArray[11]) == 1 ? true :
>> false);
>> cellStyle.setIndention(Short.valueOf(attrArray[12]));
>> cellStyle.setLeftBorderColor(Short.valueOf(attrArray[13]));
>> cellStyle.setLocked(Short.valueOf(attrArray[14]) == 1 ? true :
>> false);
>> cellStyle.setRightBorderColor(Short.valueOf(attrArray[15]));
>> cellStyle.setRotation(Short.valueOf(attrArray[16]));
>> cellStyle.setTopBorderColor(Short.valueOf(attrArray[17]));
>> cellStyle.setVerticalAlignment(Short.valueOf(attrArray[18]));
>> cellStyle.setWrapText(Short.valueOf(attrArray[19]) == 1 ? true :
>> false);
>> }
>>
>> /**
>> * Creates a delimited 'list' of the set of attributes recovered from
>> * a cell style object.
>> *
>> * @param originalCellStyle The cell style object that will be
>> interrogated
>> * for it's attributes.
>> * @param backgroundColour A primitive short that contains the index
>> for
>> * a colour within a workbook. Note that this
>> is the
>> * colour for the background of a cell.
>> * @param foregroundColour A primitive short that contains the index
>> for
>> * a colour within a workbook. Note that this
>> is the
>> * colour for the foreground of a cell.
>> * @param fillPattern A primitive short that contains the index for
>> * a fill patter within a workbook.
>> * @return An instance of the String class encapsulating a delimited
>> list
>> * of the cell styles attributes.
>> */
>> private static String getStyleKey(HSSFCellStyle originalCellStyle,
>> short backgroundColour, short foregroundColour, short
>> fillPattern) {
>> StringBuilder builder = new StringBuilder();
>> builder.append(originalCellStyle.getAlignment());
>> builder.append(SEPARATOR);
>> builder.append(originalCellStyle.getBorderBottom());
>> builder.append(SEPARATOR);
>> builder.append(originalCellStyle.getBorderLeft());
>> builder.append(SEPARATOR);
>> builder.append(originalCellStyle.getBorderRight());
>> builder.append(SEPARATOR);
>> builder.append(originalCellStyle.getBorderTop());
>> builder.append(SEPARATOR);
>> builder.append(originalCellStyle.getBottomBorderColor());
>> builder.append(SEPARATOR);
>> builder.append(originalCellStyle.getDataFormat());
>> builder.append(SEPARATOR);
>> // Rather than get what the cell contains for theses next three
>> // attributes - background colour, foreground colour and fill
>> pattern -
>> // substitute what we want to see instead.
>> builder.append(backgroundColour);
>> builder.append(SEPARATOR);
>> builder.append(foregroundColour);
>> builder.append(SEPARATOR);
>> builder.append(fillPattern);
>> builder.append(SEPARATOR);
>> builder.append(originalCellStyle.getFontIndex());
>> builder.append(SEPARATOR);
>> // Convert boolean values into numeric vaues; true will become 1
>> in the
>> // list and false 0.
>> builder.append(originalCellStyle.getHidden() ? 1 : 0);
>> builder.append(SEPARATOR);
>> builder.append(originalCellStyle.getIndention());
>> builder.append(SEPARATOR);
>> builder.append(originalCellStyle.getLeftBorderColor());
>> builder.append(SEPARATOR);
>> builder.append(originalCellStyle.getLocked() ? 1 : 0);
>> builder.append(SEPARATOR);
>> builder.append(originalCellStyle.getRightBorderColor());
>> builder.append(SEPARATOR);
>> builder.append(originalCellStyle.getRotation());
>> builder.append(SEPARATOR);
>> builder.append(originalCellStyle.getTopBorderColor());
>> builder.append(SEPARATOR);
>> builder.append(originalCellStyle.getVerticalAlignment());
>> builder.append(SEPARATOR);
>> builder.append(originalCellStyle.getWrapText() ? 1 : 0);
>> return(builder.toString());
>> }
>> }
>>
>> Yours
>>
>> Mark B
>>
>> yehogold wrote:
>>>
>>> I just realized that I had made an error when experimenting with your
>>> code. I had been looking for the modified cell on the wrong worksheet.
>>> The code actually did work. Sorry about that. :wistle:
>>>
>>> I am actually using the 'ss' for the program, if that makes a
>>> difference.
>>>
>>> Thank you,
>>>
>>> yehogold
>>>
>>>
>>> MSB wrote:
>>>>
>>>> I surprised to read this paragraph in your reply to my last message;
>>>>
>>>> "I experimented with your code and I've found that it works, assuming
>>>> that the cell we are cloning from is from a seperate sheet. If I clone
>>>> from the same sheet, even if it is a different cell, the program
>>>> doesn't change the style of the cell at all."
>>>>
>>>> because I tested the code using one sheet from the workbook you
>>>> attached to a previous message, I cloned the style from cell B3 on
>>>> Sheet2, modified it and then applied it to cell B7 also on Sheet2 if I
>>>> remember correctly so it's surprising that you are experiencing
>>>> problems. Are you using what I refer to as the ss (Workbook, Row, Clee,
>>>> etc) classes so that you can process either binary or OpenXML workbooks
>>>> without having to worry about the format? I wonder if this could be the
>>>> cause; will re-write the code to target these classes and test it again
>>>> to see if I am correct.
>>>>
>>>> One thing we could think of is writing our own clone method. The
>>>> original was added to support cloning styles from different workbooks
>>>> and in this case, there is no need to worry about whether the workbook
>>>> has a specific font installed, for example, we can assume it does. Will
>>>> try to put together something very quick and dirty this weekend to see
>>>> how that works; the added advantage of this is that we could also use
>>>> it as tha basis for the style pooling - look in the collection for a
>>>> style with these attributes and if one is not found create it, add it
>>>> to the collection and return.
>>>>
>>>> Yours
>>>>
>>>> Mark B
>>>>
>>>>
>>>> yehogold wrote:
>>>>>
>>>>> Depending on the workbook, it is possible that a large number of cells
>>>>> will need to be marked, although I am unsure if it will hit the limit
>>>>> of the number of styles (I think its in the 1000s). In any case, I
>>>>> was planning on eventually implementing some sort of 'style pooling'
>>>>> simply to keep the files from getting too big.
>>>>>
>>>>> I experimented with your code and I've found that it works, assuming
>>>>> that the cell we are cloning from is from a seperate sheet. If I
>>>>> clone from the same sheet, even if it is a different cell, the program
>>>>> doesn't change the style of the cell at all.
>>>>>
>>>>> For the application that I am writting, I was planning on cloning the
>>>>> style not only from the sheet I am marking, but from the exact cell
>>>>> that I am marking. The reason is that different cells may have
>>>>> different style in the workbook and I am trying to just simply add red
>>>>> strips to the current style of the cell. I'm starting to wonder if
>>>>> this is possible. Is there a restriction regaurding what cells you
>>>>> may set to a particular cloned cellStyle?
>>>>>
>>>>> Also, the WorkbookFactory did solve my other issue. Thank you for the
>>>>> advice.
>>>>>
>>>>> yehogold
>>>>>
>>>>>
>>>>>
>>>>> MSB wrote:
>>>>>>
>>>>>> OK, will have a look at the workbooks a little later.
>>>>>>
>>>>>> I do have one further question; do you have any idea of roughly how
>>>>>> many of these cells you will have to alter? The reason I ask is that
>>>>>> Excel places a limit on the number of different format/style objects
>>>>>> you can create - at least the .xls binary format does, I am not so
>>>>>> certain about the OpenXML based one. As a result, we may need to look
>>>>>> into 'style pooling' if you are going to be altering the format on a
>>>>>> reasonably large number of cells. This should be quite
>>>>>> straightforward to implement - use some form of Collections object to
>>>>>> manage the styles and check to see if one already exists with the
>>>>>> attributes we require before creating a new one - but it is an extra
>>>>>> wrinkle to take into consideration.
>>>>>>
>>>>>> If I have the time over the weekend, I will try to put something
>>>>>> together.
>>>>>>
>>>>>> Yours
>>>>>>
>>>>>> Mark B
>>>>>>
>>>>>> PS Did the WorkbookFactory solve your other problem?
>>>>>>
>>>>>>
>>>>>> yehogold wrote:
>>>>>>>
>>>>>>> It sounds like you've got it. I will be removing the highlighting
>>>>>>> applied to the cells using the POI. Here is the function I
>>>>>>> currently have written to do that:
>>>>>>>
>>>>>>> public void clearMark(Cell cell)
>>>>>>> {
>>>>>>> if (cell.getCellStyle().getFillPattern() ==
>>>>>>> CellStyle.THIN_BACKWARD_DIAG)
>>>>>>> {
>>>>>>> Workbook wb = cell.getSheet().getWorkbook();
>>>>>>> CellStyle clearStyle = wb.createCellStyle();
>>>>>>>
>>>>>>> clearStyle.cloneStyleFrom(cell.getCellStyle());
>>>>>>>
>>>>>>>
>>>>>>> clearStyle.setFillForegroundColor(Font.COLOR_NORMAL);
>>>>>>> clearStyle.setFillPattern(CellStyle.NO_FILL);
>>>>>>>
>>>>>>> cell.setCellStyle(clearStyle);
>>>>>>> }
>>>>>>> }
>>>>>>>
>>>>>>> I've tried testing it on its own, using cells that I marked manually
>>>>>>> with the red-strips using Excel. It mostly works, however it does
>>>>>>> cause two bugs.
>>>>>>>
>>>>>>> First, although it retains the font and text color of the cell, it
>>>>>>> does not retain the background color of the cell.
>>>>>>>
>>>>>>> Second, when run on a .xlsx file, Excel complains that it found
>>>>>>> unreadable content in the workbook. It can repair the problem and
>>>>>>> open the workbook, but gives you a warning message when you open it.
>>>>>>>
>>>>>>> I am attaching 4 versions of a test work book. The two book1's are
>>>>>>> identical workbooks before the above function was run on them in two
>>>>>>> different formats, book1_after's are the resultant files after the
>>>>>>> function was run.
>>>>>>>
>>>>>>> Thank you,
>>>>>>>
>>>>>>> yehogold
>>>>>>>
>>>>>>> http://www.nabble.com/file/p24972448/Book1.xls Book1.xls
>>>>>>> http://www.nabble.com/file/p24972448/Book1.xlsx Book1.xlsx
>>>>>>> http://www.nabble.com/file/p24972448/Book1_after.xls Book1_after.xls
>>>>>>> http://www.nabble.com/file/p24972448/Book1_after.xlsx
>>>>>>> Book1_after.xlsx
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> MSB wrote:
>>>>>>>>
>>>>>>>> At the risk of repeating myself, I want to be completely clear
>>>>>>>> about this;
>>>>>>>>
>>>>>>>> You are reading in an existing workbook.
>>>>>>>> You want to clone the style from one of the cells of that workbook
>>>>>>>> and then modify it such that the forground consists of a pattern of
>>>>>>>> diagonal red bars. This format will be used to mark or highlight
>>>>>>>> cells that conform to a specific criteria and you will be
>>>>>>>> highlighting - applying the style to - them using POI.
>>>>>>>> Later, you may want to re-set or remove the highlighting applied to
>>>>>>>> the cells. How will this be done, through POI or manually. If done
>>>>>>>> through POI, how will you accomplish this? I only ask because if
>>>>>>>> you modify a style that has been applied to one or more cells,
>>>>>>>> every cell that style has been applied to will be affected - so it
>>>>>>>> would be better to change the style applied to another one.
>>>>>>>>
>>>>>>>> Will proceed on this premise but cannot promise anything soon.
>>>>>>>>
>>>>>>>> Yours
>>>>>>>>
>>>>>>>> Mark B
>>>>>>>>
>>>>>>>>
>>>>>>>> yehogold wrote:
>>>>>>>>>
>>>>>>>>> I am, indeed, cloning a cellStyle from the same workbook.
>>>>>>>>>
>>>>>>>>> The point of this portion of the program is to mark the cell of an
>>>>>>>>> existing workbook that was created using EXCEL, not the POI.
>>>>>>>>> Therefore, I am opening and reading in the workbook.
>>>>>>>>>
>>>>>>>>> What I would like to do is to mark the cell with red diagonal
>>>>>>>>> lines in the foreground. I would like the rest of the format to
>>>>>>>>> remain the same as it was before, allowing me to "unmark" it at a
>>>>>>>>> later point, returning it to its original format. Therefore, if
>>>>>>>>> the background is white, I would like it to stay white, if it is
>>>>>>>>> blue, I would like it to stay blue, if the font is bold, I would
>>>>>>>>> like it to stay bold, etc.
>>>>>>>>>
>>>>>>>>> Thank you again for spending so much time on this,
>>>>>>>>>
>>>>>>>>> yehogold
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> MSB wrote:
>>>>>>>>>>
>>>>>>>>>> Sorry about BiffViewer. I was assuming that you were cloning a
>>>>>>>>>> style from one workbook for use in a different workbook.
>>>>>>>>>> BiffViwere would have allowed you to see what the differences
>>>>>>>>>> were between the original style and the clone had this been the
>>>>>>>>>> case.
>>>>>>>>>>
>>>>>>>>>> Now, from what you have said, it seems as though you are cloning
>>>>>>>>>> a style within a workbook, can I ask, is this the case? If so,
>>>>>>>>>> are you building the workbook entirely using POI or are you
>>>>>>>>>> opening and then modifying an existing workbook? If the former,
>>>>>>>>>> then the easy way to get around the problem is to not clone and
>>>>>>>>>> then modify a style but to build it completely from scratch, even
>>>>>>>>>> though this does mean a few lines of repeated code.
>>>>>>>>>>
>>>>>>>>>> If I have the time tomorrow, I will experiment with the workbook
>>>>>>>>>> you attached to see if I can replicate the problem. Can I check
>>>>>>>>>> to make sure that the style you are looking for has a white
>>>>>>>>>> background to the cell and red diagonal bars in the foreground?
>>>>>>>>>>
>>>>>>>>>> Yours
>>>>>>>>>>
>>>>>>>>>> Mark B
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> yehogold wrote:
>>>>>>>>>>>
>>>>>>>>>>> I used the BiffViewer to look at the file, but I'm not sure how
>>>>>>>>>>> to read what I am looking at. I can see many different kinds of
>>>>>>>>>>> style objects and a couple of cell objects, but am not sure how
>>>>>>>>>>> you know what cell has what style.
>>>>>>>>>>> Is there anywhere where there are instructions on how to read
>>>>>>>>>>> the output of the BiffViewer?
>>>>>>>>>>>
>>>>>>>>>>> As shown in the code, the new cellStyle was created by cloning
>>>>>>>>>>> the cellStyle of the cell, modifying it, and setting the
>>>>>>>>>>> cellStyle of the cell to the newly modified clone.
>>>>>>>>>>>
>>>>>>>>>>> I don't remember what the original style of the cells were in
>>>>>>>>>>> the workbook attached to my first method. I am attaching a
>>>>>>>>>>> second workbook were I know that the original cellStyle of all
>>>>>>>>>>> the cells was the default, i.e. I did not modify the style
>>>>>>>>>>> before running the workbook through the program.
>>>>>>>>>>>
>>>>>>>>>>> Please let me know if anyone has any ideas.
>>>>>>>>>>>
>>>>>>>>>>> Thank again in advance for your time.
>>>>>>>>>>>
>>>>>>>>>>> Regaurds,
>>>>>>>>>>> yehogold
>>>>>>>>>>>
>>>>>>>>>>> http://www.nabble.com/file/p24955769/workbook.xls workbook.xls
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> MSB wrote:
>>>>>>>>>>>>
>>>>>>>>>>>> As a first step, I would reccomend that you investigate alittle
>>>>>>>>>>>> using the BiffViewer utility. That may tell you which
>>>>>>>>>>>> attributes of the cell style are either not being set correctly
>>>>>>>>>>>> or corrunpted by the clone process.
>>>>>>>>>>>>
>>>>>>>>>>>> Does the example workbook you have posted contain both the
>>>>>>>>>>>> corrupted cell style and the style that you are cloning to
>>>>>>>>>>>> create it in the first instance?
>>>>>>>>>>>>
>>>>>>>>>>>> Yours
>>>>>>>>>>>>
>>>>>>>>>>>> Mark B
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> yehogold wrote:
>>>>>>>>>>>>>
>>>>>>>>>>>>> Hi.
>>>>>>>>>>>>>
>>>>>>>>>>>>> I have the following code used to modify the pattern of a
>>>>>>>>>>>>> cell:
>>>>>>>>>>>>>
>>>>>>>>>>>>> Workbook wb = cell.getSheet().getWorkbook();
>>>>>>>>>>>>> CellStyle errorStyle = wb.createCellStyle();
>>>>>>>>>>>>>
>>>>>>>>>>>>> errorStyle.cloneStyleFrom(cell.getCellStyle());
>>>>>>>>>>>>>
>>>>>>>>>>>>> errorStyle.setFillForegroundColor(Font.COLOR_RED);
>>>>>>>>>>>>> errorStyle.setFillPattern(CellStyle.THIN_BACKWARD_DIAG);
>>>>>>>>>>>>>
>>>>>>>>>>>>> cell.setCellStyle(errorStyle);
>>>>>>>>>>>>>
>>>>>>>>>>>>> When I run it, I end up getting these weird looking black
>>>>>>>>>>>>> cells. Excel 2003 will also not let me directly change the
>>>>>>>>>>>>> format of the black cells. How would I format the cells
>>>>>>>>>>>>> withouth getting this problem?
>>>>>>>>>>>>>
>>>>>>>>>>>>> I am inclosing one of the workbooks. The messed up black
>>>>>>>>>>>>> cells are on sheet2.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Thank you in advance for your help.
>>>>>>>>>>>>> http://www.nabble.com/file/p24923092/workbook2.xls
>>>>>>>>>>>>> workbook2.xls
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>
>>
>>
>
>
--
View this message in context:
http://www.nabble.com/Weird-cells-appearing-after-modifying-the-format-of-a-cell-tp24923092p25038710.html
Sent from the POI - User mailing list archive at Nabble.com.
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]