You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@myfaces.apache.org by "Emil Cazacu (JIRA)" <de...@myfaces.apache.org> on 2007/05/08 09:45:15 UTC

[jira] Created: (TOMAHAWK-980) ExcelExport - corrections to Excel generation - when a commandLink on a column

ExcelExport - corrections to Excel generation - when a commandLink on a column
------------------------------------------------------------------------------

                 Key: TOMAHAWK-980
                 URL: https://issues.apache.org/jira/browse/TOMAHAWK-980
             Project: MyFaces Tomahawk
          Issue Type: Bug
    Affects Versions: 1.1.5
         Environment: Suse 10.0
Firefox 1.5.0.10
apache-tomcat-5.5.20
            Reporter: Emil Cazacu
             Fix For: 1.1.5


Bugs:

1. - If my datatable has a commandLink, the value on it is not displayed e.g.
<t:column>
    <f:facet name="header">
        <t:outputText value="Product" />
    </f:facet>
    <t:commandLink action="navToEditForProdus">
        <t:outputText value="#{dataItem.den}" />
        <t:updateActionListener property="#{XxxUIBean.id}" value="#{dataItem.id}" />
    </t:commandLink>
</t:column>
I know that this one can be overcome by using 
    <t:commandLink action="navToEditForProdus" value="#{dataItem.den}"
but I have tones of code, I do not want to have this one on my mind too.

2. - the header is not bold, (this is less important)



I have the correction (JSE 5), working ok for me:
in class ExcelExportPhaseListener.java

  /**
   * If it is null, simply adds an empty cell<br>
   * If it is a ValueHolder, adds empty cell with that value<br>
   * If it is a Command (link or button), tries to add the correct displayed
   * text - either on value attribute or in a ValueHolder child<br>
   */
  @SuppressWarnings("unchecked")
  private void addColumnValue(
      HSSFWorkbook workbook,
      HSSFRow rowHeader,
      UIComponent component,
      int index,
      boolean headerCell) {
    HSSFCell cell = rowHeader.createCell((short) index);
    cell.setEncoding(HSSFCell.ENCODING_UTF_16);

    if (headerCell) {
      // we make the line with the header in bold
      HSSFFont font = workbook.createFont();
      font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

      HSSFCellStyle style = workbook.createCellStyle();
      style.setFont(font);
      cell.setCellStyle(style);
    }

    String stringValue = null;
    if (component == null) {
      // null is the returned value
      stringValue = null;
    } else if (component instanceof ValueHolder) {
      stringValue = RendererUtils.getStringValue(FacesContext.getCurrentInstance(),
          component);

    } else if (component instanceof UICommand) {
      // to cope with the fact that the values of the links are not displayed

      UICommand cmd = (UICommand) component;
      if (cmd.getValue() != null) {
        // if that command has value attribute
        stringValue = "" + cmd.getValue();
      } else {
        // value attribute is null, so let's look in the children
        List<UIComponent> children = cmd.getChildren();
        for (int i = 0; i < children.size(); i++) {
          UIComponent child = children.get(i);
          if (child instanceof ValueHolder) {
            // we eventually found a component with a value, we use it
            stringValue = RendererUtils.getStringValue(FacesContext.getCurrentInstance(),
                child);
            break;
          }
        }
      }
    }
    if (stringValue != null) {
      cell.setCellValue(stringValue);
    }
  }


  The other methods modified to cope with the changes int the method addColumnValue(...).
  Only simple pass of "HSSFWorkbook workbook" or "boolean headerCell" - nothing more:

  // for header
  private void addColumnHeaders(HSSFWorkbook workbook, HSSFSheet sheet, List columns) {
    HSSFRow rowHeader = sheet.createRow(0);

    for (int i = 0; i < columns.size(); i++) {
      UIColumn column = (UIColumn) columns.get(i);
      addColumnValue(workbook, rowHeader, column.getHeader(), i, true);
    }
  }

  // for the other table 
  private void addColumnValues(
      HSSFWorkbook workbook,
      HSSFSheet sheet,
      List columns,
      HtmlDataTable dataTable) {
    for (int i = 0; i < dataTable.getRowCount(); i++) {
      dataTable.setRowIndex(i);
      HSSFRow row = sheet.createRow(i + 1);
      for (int j = 0; j < columns.size(); j++) {
        UIColumn column = (UIColumn) columns.get(j);
        addColumnValue(workbook, row, (UIComponent) column.getChildren().get(0), j, false);
      }
    }
  }

  // the caller
  private HSSFWorkbook generateExcel(FacesContext facesContext, HtmlDataTable table) {
    HSSFWorkbook workbook = new HSSFWorkbook();
    HSSFSheet sheet = workbook.createSheet(table.getId());
    List columns = getColumns(table);
    int currentRowIndex = table.getRowIndex();

    addColumnHeaders(workbook, sheet, columns);
    addColumnValues(workbook, sheet, columns, table);

    table.setRowIndex(currentRowIndex);
    return workbook;
  }
  

I looked on the repository, and the latest sources are with the bug.
http://svn.apache.org/repos/asf/myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/excelexport/ExcelExportPhaseListener.java


Excel Exporter is a nice feature, and if there is anything I can do to help, please contact me.


-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Commented: (TOMAHAWK-980) ExcelExport - corrections to Excel generation - when a commandLink on a column

Posted by "Emil Cazacu (JIRA)" <de...@myfaces.apache.org>.
    [ https://issues.apache.org/jira/browse/TOMAHAWK-980?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12501890 ] 

Emil Cazacu commented on TOMAHAWK-980:
--------------------------------------

I used this tag (locally modified) intensively, and I think I know how it would fit exactly my needs:

using  <f:facet name="excel">...</
to control exactly what I want to display.
This way is the most flexible way and no "guesing" is involved.

-------------------
<h:column>
  <f:facet name="header">
    <h:outputText value="GTIN" />
  </f:facet>
  
  <f:facet name="excel">
	<t:outputText value="#{dataItem.gtin.gtin}" />
  </f:facet>
  
  ... the rest of column tags
</h:column>
--------------------

I don't know how to code that.


> ExcelExport - corrections to Excel generation - when a commandLink on a column
> ------------------------------------------------------------------------------
>
>                 Key: TOMAHAWK-980
>                 URL: https://issues.apache.org/jira/browse/TOMAHAWK-980
>             Project: MyFaces Tomahawk
>          Issue Type: Bug
>    Affects Versions: 1.1.5
>         Environment: Suse 10.0
> Firefox 1.5.0.10
> apache-tomcat-5.5.20
>            Reporter: Emil Cazacu
>            Assignee: Cagatay Civici
>             Fix For: 1.1.5
>
>
> Bugs:
> 1. - If my datatable has a commandLink, the value on it is not displayed e.g.
> <t:column>
>     <f:facet name="header">
>         <t:outputText value="Product" />
>     </f:facet>
>     <t:commandLink action="navToEditForProdus">
>         <t:outputText value="#{dataItem.den}" />
>         <t:updateActionListener property="#{XxxUIBean.id}" value="#{dataItem.id}" />
>     </t:commandLink>
> </t:column>
> I know that this one can be overcome by using 
>     <t:commandLink action="navToEditForProdus" value="#{dataItem.den}"
> but I have tones of code, I do not want to have this one on my mind too.
> 2. - the header is not bold, (this is less important)
> I have the correction (JSE 5), working ok for me:
> in class ExcelExportPhaseListener.java
>   /**
>    * If it is null, simply adds an empty cell<br>
>    * If it is a ValueHolder, adds empty cell with that value<br>
>    * If it is a Command (link or button), tries to add the correct displayed
>    * text - either on value attribute or in a ValueHolder child<br>
>    */
>   @SuppressWarnings("unchecked")
>   private void addColumnValue(
>       HSSFWorkbook workbook,
>       HSSFRow rowHeader,
>       UIComponent component,
>       int index,
>       boolean headerCell) {
>     HSSFCell cell = rowHeader.createCell((short) index);
>     cell.setEncoding(HSSFCell.ENCODING_UTF_16);
>     if (headerCell) {
>       // we make the line with the header in bold
>       HSSFFont font = workbook.createFont();
>       font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
>       HSSFCellStyle style = workbook.createCellStyle();
>       style.setFont(font);
>       cell.setCellStyle(style);
>     }
>     String stringValue = null;
>     if (component == null) {
>       // null is the returned value
>       stringValue = null;
>     } else if (component instanceof ValueHolder) {
>       stringValue = RendererUtils.getStringValue(FacesContext.getCurrentInstance(),
>           component);
>     } else if (component instanceof UICommand) {
>       // to cope with the fact that the values of the links are not displayed
>       UICommand cmd = (UICommand) component;
>       if (cmd.getValue() != null) {
>         // if that command has value attribute
>         stringValue = "" + cmd.getValue();
>       } else {
>         // value attribute is null, so let's look in the children
>         List<UIComponent> children = cmd.getChildren();
>         for (int i = 0; i < children.size(); i++) {
>           UIComponent child = children.get(i);
>           if (child instanceof ValueHolder) {
>             // we eventually found a component with a value, we use it
>             stringValue = RendererUtils.getStringValue(FacesContext.getCurrentInstance(),
>                 child);
>             break;
>           }
>         }
>       }
>     }
>     if (stringValue != null) {
>       cell.setCellValue(stringValue);
>     }
>   }
>   The other methods modified to cope with the changes int the method addColumnValue(...).
>   Only simple pass of "HSSFWorkbook workbook" or "boolean headerCell" - nothing more:
>   // for header
>   private void addColumnHeaders(HSSFWorkbook workbook, HSSFSheet sheet, List columns) {
>     HSSFRow rowHeader = sheet.createRow(0);
>     for (int i = 0; i < columns.size(); i++) {
>       UIColumn column = (UIColumn) columns.get(i);
>       addColumnValue(workbook, rowHeader, column.getHeader(), i, true);
>     }
>   }
>   // for the other table 
>   private void addColumnValues(
>       HSSFWorkbook workbook,
>       HSSFSheet sheet,
>       List columns,
>       HtmlDataTable dataTable) {
>     for (int i = 0; i < dataTable.getRowCount(); i++) {
>       dataTable.setRowIndex(i);
>       HSSFRow row = sheet.createRow(i + 1);
>       for (int j = 0; j < columns.size(); j++) {
>         UIColumn column = (UIColumn) columns.get(j);
>         addColumnValue(workbook, row, (UIComponent) column.getChildren().get(0), j, false);
>       }
>     }
>   }
>   // the caller
>   private HSSFWorkbook generateExcel(FacesContext facesContext, HtmlDataTable table) {
>     HSSFWorkbook workbook = new HSSFWorkbook();
>     HSSFSheet sheet = workbook.createSheet(table.getId());
>     List columns = getColumns(table);
>     int currentRowIndex = table.getRowIndex();
>     addColumnHeaders(workbook, sheet, columns);
>     addColumnValues(workbook, sheet, columns, table);
>     table.setRowIndex(currentRowIndex);
>     return workbook;
>   }
>   
> I looked on the repository, and the latest sources are with the bug.
> http://svn.apache.org/repos/asf/myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/excelexport/ExcelExportPhaseListener.java
> Excel Exporter is a nice feature, and if there is anything I can do to help, please contact me.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Commented: (TOMAHAWK-980) ExcelExport - corrections to Excel generation - when a commandLink on a column

Posted by "Emil Cazacu (JIRA)" <de...@myfaces.apache.org>.
    [ https://issues.apache.org/jira/browse/TOMAHAWK-980?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12501887 ] 

Emil Cazacu commented on TOMAHAWK-980:
--------------------------------------

Hi,

I encountered a bug, when dealing with <h:panelGroup .
In order to correct the behavior, I changed (locally - on my computer) the method addColumnValue(...):
- it adds in the excel cell the first text (notnull or not empty) that it finds in the tree of components, using a recursive call.

I add herein the code, and I hope that it will fit you needs.

--------------------
  /**
   * If it is null, simply adds an empty cell<br>
   * If it is a ValueHolder, adds empty cell with that value<br>
   * If it is a Command (link or button), tries to add the correct displayed
   * text - either on value attribute or in a ValueHolder child<br>
   */
  @SuppressWarnings("unchecked")
  private void addColumnValue(
      HSSFWorkbook workbook,
      HSSFRow rowHeader,
      UIComponent component,
      int index,
      boolean headerCell) {
    HSSFCell cell = rowHeader.createCell((short) index);
    cell.setEncoding(HSSFCell.ENCODING_UTF_16);

    if (headerCell) {
      // we make the line with the header in bold
      HSSFFont font = workbook.createFont();
      font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

      HSSFCellStyle style = workbook.createCellStyle();
      style.setFont(font);
      cell.setCellStyle(style);
    }

    String stringValue = getFirstTextFromUIComponent(component);

    if (stringValue != null) {
      cell.setCellValue(stringValue);
    }
  }



  /**
   * Recursive call<br>
   * This method will return the value of the first encountered ValueHolder.<br>
   * 
   * With this method we try meet the largest variation.<br>
   * It is far from perfect, and far from being any way configurable.
   */
  private String getFirstTextFromUIComponent(UIComponent component) {
    // null verification
    if (component == null) {
      return null;
    }

    // ValueHolder -> UIInput, UIOutput:
    if (component instanceof ValueHolder) {
      String value = RendererUtils.getStringValue(FacesContext.getCurrentInstance(),
          component);
      if (value != null && !"".equals(value)) {
        return value;
      }
    }

    // to cope with the fact that the values of the links are not displayed
    // <t:commandLink value="#{dataItem.denumireLunga}" ...
    if (component instanceof UICommand) {
      UICommand cmd = (UICommand) component;
      if (cmd.getValue() != null) {
        // if that command has value attribute
        String value = "" + cmd.getValue();
        if (value != null && !"".equals(value)) {
          return value;
        }
      }
    }

    // we loop through children to find a ValueHolder
    List<UIComponent> children = component.getChildren();
    for (int i = 0; i < children.size(); i++) {
      String value = getFirstTextFromUIComponent(children.get(i));
      if (value != null && !"".equals(value)) {
        // we have found a not null value in one of the children,
        // so we will return it
        return value;
      }
    }

    return null;
  }


> ExcelExport - corrections to Excel generation - when a commandLink on a column
> ------------------------------------------------------------------------------
>
>                 Key: TOMAHAWK-980
>                 URL: https://issues.apache.org/jira/browse/TOMAHAWK-980
>             Project: MyFaces Tomahawk
>          Issue Type: Bug
>    Affects Versions: 1.1.5
>         Environment: Suse 10.0
> Firefox 1.5.0.10
> apache-tomcat-5.5.20
>            Reporter: Emil Cazacu
>            Assignee: Cagatay Civici
>             Fix For: 1.1.5
>
>
> Bugs:
> 1. - If my datatable has a commandLink, the value on it is not displayed e.g.
> <t:column>
>     <f:facet name="header">
>         <t:outputText value="Product" />
>     </f:facet>
>     <t:commandLink action="navToEditForProdus">
>         <t:outputText value="#{dataItem.den}" />
>         <t:updateActionListener property="#{XxxUIBean.id}" value="#{dataItem.id}" />
>     </t:commandLink>
> </t:column>
> I know that this one can be overcome by using 
>     <t:commandLink action="navToEditForProdus" value="#{dataItem.den}"
> but I have tones of code, I do not want to have this one on my mind too.
> 2. - the header is not bold, (this is less important)
> I have the correction (JSE 5), working ok for me:
> in class ExcelExportPhaseListener.java
>   /**
>    * If it is null, simply adds an empty cell<br>
>    * If it is a ValueHolder, adds empty cell with that value<br>
>    * If it is a Command (link or button), tries to add the correct displayed
>    * text - either on value attribute or in a ValueHolder child<br>
>    */
>   @SuppressWarnings("unchecked")
>   private void addColumnValue(
>       HSSFWorkbook workbook,
>       HSSFRow rowHeader,
>       UIComponent component,
>       int index,
>       boolean headerCell) {
>     HSSFCell cell = rowHeader.createCell((short) index);
>     cell.setEncoding(HSSFCell.ENCODING_UTF_16);
>     if (headerCell) {
>       // we make the line with the header in bold
>       HSSFFont font = workbook.createFont();
>       font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
>       HSSFCellStyle style = workbook.createCellStyle();
>       style.setFont(font);
>       cell.setCellStyle(style);
>     }
>     String stringValue = null;
>     if (component == null) {
>       // null is the returned value
>       stringValue = null;
>     } else if (component instanceof ValueHolder) {
>       stringValue = RendererUtils.getStringValue(FacesContext.getCurrentInstance(),
>           component);
>     } else if (component instanceof UICommand) {
>       // to cope with the fact that the values of the links are not displayed
>       UICommand cmd = (UICommand) component;
>       if (cmd.getValue() != null) {
>         // if that command has value attribute
>         stringValue = "" + cmd.getValue();
>       } else {
>         // value attribute is null, so let's look in the children
>         List<UIComponent> children = cmd.getChildren();
>         for (int i = 0; i < children.size(); i++) {
>           UIComponent child = children.get(i);
>           if (child instanceof ValueHolder) {
>             // we eventually found a component with a value, we use it
>             stringValue = RendererUtils.getStringValue(FacesContext.getCurrentInstance(),
>                 child);
>             break;
>           }
>         }
>       }
>     }
>     if (stringValue != null) {
>       cell.setCellValue(stringValue);
>     }
>   }
>   The other methods modified to cope with the changes int the method addColumnValue(...).
>   Only simple pass of "HSSFWorkbook workbook" or "boolean headerCell" - nothing more:
>   // for header
>   private void addColumnHeaders(HSSFWorkbook workbook, HSSFSheet sheet, List columns) {
>     HSSFRow rowHeader = sheet.createRow(0);
>     for (int i = 0; i < columns.size(); i++) {
>       UIColumn column = (UIColumn) columns.get(i);
>       addColumnValue(workbook, rowHeader, column.getHeader(), i, true);
>     }
>   }
>   // for the other table 
>   private void addColumnValues(
>       HSSFWorkbook workbook,
>       HSSFSheet sheet,
>       List columns,
>       HtmlDataTable dataTable) {
>     for (int i = 0; i < dataTable.getRowCount(); i++) {
>       dataTable.setRowIndex(i);
>       HSSFRow row = sheet.createRow(i + 1);
>       for (int j = 0; j < columns.size(); j++) {
>         UIColumn column = (UIColumn) columns.get(j);
>         addColumnValue(workbook, row, (UIComponent) column.getChildren().get(0), j, false);
>       }
>     }
>   }
>   // the caller
>   private HSSFWorkbook generateExcel(FacesContext facesContext, HtmlDataTable table) {
>     HSSFWorkbook workbook = new HSSFWorkbook();
>     HSSFSheet sheet = workbook.createSheet(table.getId());
>     List columns = getColumns(table);
>     int currentRowIndex = table.getRowIndex();
>     addColumnHeaders(workbook, sheet, columns);
>     addColumnValues(workbook, sheet, columns, table);
>     table.setRowIndex(currentRowIndex);
>     return workbook;
>   }
>   
> I looked on the repository, and the latest sources are with the bug.
> http://svn.apache.org/repos/asf/myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/excelexport/ExcelExportPhaseListener.java
> Excel Exporter is a nice feature, and if there is anything I can do to help, please contact me.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.