Total Pageviews

2013/11/15

How to adjust column width to fit the contents in Apache POI

Problem
I utilized Apache POI to write data into excel file. But I found out each cell width has the same default width, it does not adjust it's width based on its contents.

Solution
You can call autoSizeColumn method in HSSFSheet to fix this problem.
Here is the JavaDoc: http://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFSheet.html#autoSizeColumn(int, boolean)
If you have 10 columns, you need to call autoSizeColumn 10 times in for-loop.
For example.
1:          for (int resizeCnt = 0; resizeCnt < pdateSet.size() + 3; resizeCnt++) {  
2:            sheet.autoSizeColumn(resizeCnt);  
3:          }  
Check the result after we call autoSizeColumn. 
You can see some columns' width may not really fit the contents, but it's much better than the original one.

Apache Commons Application - Predicate Chain

Requirement
If you have a collection of value object, and would like to do search just like SQL.
And you may have more complex requirement, ex. two or more search criteria.
You may can try Apache Commons CollectionUtils and BeanUtils.

Example
Prepare a bean class whose named person with 3 attributes (name, birthPlace and department)
1:  /**  
2:   *   
3:   */  
4:  package test.collection;  
5:  import java.io.Serializable;  
6:  // TODO: Auto-generated Javadoc  
7:  /**  
8:   * The Class Person.  
9:   *   
10:   * @author albert  
11:   */  
12:  public class Person implements Serializable {  
13:       /** The Constant serialVersionUID. */  
14:       private static final long serialVersionUID = -4637096033730683016L;  
15:       /** The name. */  
16:       private String name;  
17:       /** The birth place. */  
18:       private String birthPlace;  
19:       /** The department. */  
20:       private String department;  
21:       /**  
22:        * Instantiates a new person.  
23:        */  
24:       public Person() {  
25:            super();  
26:            // TODO Auto-generated constructor stub  
27:       }  
28:       /**  
29:        * Instantiates a new person.  
30:        *   
31:        * @param name  
32:        *      the name  
33:        * @param birthPlace  
34:        *      the birth place  
35:        * @param department  
36:        *      the department  
37:        */  
38:       public Person(String name, String birthPlace, String department) {  
39:            super();  
40:            this.name = name;  
41:            this.birthPlace = birthPlace;  
42:            this.department = department;  
43:       }  
44:       /**  
45:        * Gets the name.  
46:        *   
47:        * @return the name  
48:        */  
49:       public String getName() {  
50:            return name;  
51:       }  
52:       /**  
53:        * Sets the name.  
54:        *   
55:        * @param name  
56:        *      the new name  
57:        */  
58:       public void setName(String name) {  
59:            this.name = name;  
60:       }  
61:       /**  
62:        * Gets the birth place.  
63:        *   
64:        * @return the birth place  
65:        */  
66:       public String getBirthPlace() {  
67:            return birthPlace;  
68:       }  
69:       /**  
70:        * Sets the birth place.  
71:        *   
72:        * @param birthPlace  
73:        *      the new birth place  
74:        */  
75:       public void setBirthPlace(String birthPlace) {  
76:            this.birthPlace = birthPlace;  
77:       }  
78:       /**  
79:        * Gets the department.  
80:        *   
81:        * @return the department  
82:        */  
83:       public String getDepartment() {  
84:            return department;  
85:       }  
86:       /**  
87:        * Sets the department.  
88:        *   
89:        * @param department  
90:        *      the new department  
91:        */  
92:       public void setDepartment(String department) {  
93:            this.department = department;  
94:       }  
95:       /*  
96:        * (non-Javadoc)  
97:        *   
98:        * @see java.lang.Object#toString()  
99:        */  
100:       @Override  
101:       public String toString() {  
102:            return "Person [birthPlace=" + birthPlace + ", department="  
103:                      + department + ", name=" + name + "]";  
104:       }  
105:  }  

Here is our CollectionTest class to demonstrate how to do filter in collection via Apache Commons CollectionUtils and BeanUtils.
The entry point is main method.

  • Step1. Call setUpData to create test data (List of Person).
  • Step2. Call filterDataWithTwoCriteria and pass search criteria (find out the person who birthPlace is 'ChiaYi' and work at 'DEPT1' department)
1:  package test.collection;  
2:  import java.util.ArrayList;  
3:  import java.util.List;  
4:  import org.apache.commons.beanutils.BeanPropertyValueEqualsPredicate;  
5:  import org.apache.commons.collections.CollectionUtils;  
6:  import org.apache.commons.collections.Predicate;  
7:  import org.apache.commons.collections.PredicateUtils;  
8:  // TODO: Auto-generated Javadoc  
9:  /**  
10:   * The Class CollectionTest.  
11:   */  
12:  public class CollectionTest {  
13:       /** The person list. */  
14:       List<Person> personList = new ArrayList<Person>();  
15:       /**  
16:        * Sets up data.  
17:        */  
18:       void setUpData() {  
19:            personList.add(new Person("Albert", "ChiaYi", "DEPT1"));  
20:            personList.add(new Person("Mandy", "Taipei", "DEPT2"));  
21:            personList.add(new Person("Alex", "ChiaYi", "DEPT1"));  
22:            personList.add(new Person("Chris", "Taipei", "DEPT1"));  
23:       }  
24:       /**  
25:        * Filter data with two criteria.  
26:        *   
27:        * @param birthPlace  
28:        *      the birth place  
29:        * @param department  
30:        *      the department  
31:        */  
32:       @SuppressWarnings("unchecked")  
33:       void filterDataWithTwoCriteria(String birthPlace, String department) {  
34:            // set up birth place predicate  
35:            BeanPropertyValueEqualsPredicate birthPlacePredicate = new BeanPropertyValueEqualsPredicate(  
36:                      "birthPlace", birthPlace);  
37:            // set up department predicate  
38:            BeanPropertyValueEqualsPredicate departmentPredicate = new BeanPropertyValueEqualsPredicate(  
39:                      "department", department);  
40:            // Create a new Predicate that returns true only if all of the specified  
41:            // predicates are true (i.e. birthPlace='ChiaYi' and department='DEPT1')  
42:            Predicate predicates = PredicateUtils.allPredicate(new Predicate[] {  
43:                      birthPlacePredicate, departmentPredicate });  
44:            // Selects all elements from input collection which match the given  
45:            // predicate into an output collection.  
46:            List<Person> persons = (List<Person>) CollectionUtils.select(  
47:                      personList, predicates);  
48:            // print the output collection  
49:            if (CollectionUtils.isNotEmpty(persons)) {  
50:                 for (Person person : persons) {  
51:                      System.out.println(person.toString());  
52:                 }  
53:            }  
54:       }  
55:       /**  
56:        * The main method.  
57:        *   
58:        * @param args  
59:        *      the arguments  
60:        */  
61:       public static void main(String[] args) {  
62:            CollectionTest test = new CollectionTest();  
63:            // Sets up data  
64:            test.setUpData();  
65:            // find the person who birth place is ChiaYi and work at DEPT1  
66:            // department  
67:            test.filterDataWithTwoCriteria("ChiaYi", "DEPT1");  
68:       }  
69:  }  

After executing this standalone Java application, the console will print the person whose birth place is 'ChiaYi' and work at 'DEPT1' department
1:  Person [birthPlace=ChiaYi, department=DEPT1, name=Albert]  
2:  Person [birthPlace=ChiaYi, department=DEPT1, name=Alex]  

2013/11/14

How to set currecny cell to right-justified horizontal alignment and apply 1000 separator in Apache POI

Problem
We utilized Apache POI to write excel, but some currency cells do not right-justified horizontal alignment and do not apply 1000 separator.

Solution
1:          //create CellStyle, and define style information  
2:          CellStyle cs = workbook.createCellStyle();  
3:          cs.setBorderBottom((short) 1);  
4:          cs.setBorderTop((short) 1);  
5:          cs.setBorderLeft((short) 1);  
6:          cs.setBorderRight((short) 1);  
7:          cs.setAlignment(CellStyle.ALIGN_RIGHT);//right-justified horizontal alignment  
8:          cs.setDataFormat(HSSFDataFormat.getBuiltinFormat("#,##0.00"));//apply 1000 separator  
9:          .....  
10:          .....  
11:          //set cs, the CellStyle with style information which we defined, into cell  
12:          cell.setCellStyle(cs);  


For more DataFormat information, you can check it:

Check the result

Here you can find more useful information: http://javacrazyer.iteye.com/blog/894850

2013/11/12

POI 常用API筆記

參考資料來源:http://become.wei-ting.net/2011/11/poiexcel.html

1:  File tempFile = new File(filePath,filename);//建立儲存檔案  
2:  Workbook workbook = new HSSFWorkbook();//建立Excel物件  
3:  String safeName = WorkbookUtil.createSafeSheetName(SHEETNAME);   
4:  Sheet sheet = workbook.createSheet(safeName);//建立工作表  
5:  Row row1 = sheet.createRow((short)0);//建立工作列  
6:  //字型設定  
7:  Font font = workbook.createFont();  
8:  font.setColor(HSSFColor.WHITE.index);//顏色  
9:  font.setBoldweight(Font.BOLDWEIGHT_BOLD); //粗體  
10:  //設定儲存格格式  
11:  CellStyle styleRow1 = workbook.createCellStyle();  
12:  styleRow1.setFillForegroundColor(HSSFColor.GREEN.index);//填滿顏色  
13:  styleRow1.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);  
14:  styleRow1.setFont(font);//設定字體  
15:  styleRow1.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平置中  
16:  styleRow1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直置中  
17:  //設定框線  
18:  styleRow1.setBorderBottom((short)1);  
19:  styleRow1.setBorderTop((short)1);  
20:  styleRow1.setBorderLeft((short)1);  
21:  styleRow1.setBorderRight((short)1);  
22:  styleRow1.setWrapText(true);//自動換行  
23:  Cell cell = row1.createCell(0);//建立儲存格  
24:  cell.setCellStyle(styleRow1);//套用格式  
25:  cell.setCellValue(CELLTEXT);//設定內容  
26:  sheet.autoSizeColumn(0);//自動調整欄位寬度  
27:  //儲存檔案  
28:  FileOutputStream fileOut = new FileOutputStream(tempFile);  
29:  workbook.write(fileOut);  
30:  fileOut.close();  

How do I do redirect in AngularJS

Question
I would like to do window.location (JavaScript way) to redirect page.
How do I do in AngularJS?

Answer
You can use $window.location.href=[your link]

Example
According to the system analysis specification, system should redirect to specific page based on the option which chose by user.


1:  <div class="form-group col-sm-5">  
2:            <label class="control-label">選擇查詢報表 :</label>  
3:            <select class="form-control" data-ng-change="update()"  
4:                id="reportName" name="reportName"   
5:                data-ng-model="model.reportName" >  
6:              <option value="" >請選擇</option>  
7:              <option value="ETS401R">收支狀況日報表 (總表)</option>  
8:              <option value="ETS402R">收支狀況日報表 (支出明細表)</option>  
9:              <option value="ETS403R">收支狀況日報表 (支入明細表)</option>  
10:              <option value="ETS407R">年度國庫現金餘額表</option>  
11:            </select>  
12:           </div>  

We can define $window.location.href in js file.
1:  $scope.update = function(){  
2:        var reportName = $scope.model.reportName;  
3:        $window.location.href = '/nss/'+reportName+'/';  
4:      };  

How to fix com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException

Exception
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "reportName" (class gov.nta.ets.web.dto.Ets405rFormBean), not marked as ignorable (4 known properties: , "accYy", "type", "data", "funcId"])
 at [Source: java.io.ByteArrayInputStream@57a9b75a; line: 4, column: 18] (through reference chain: gov.nta.ets.web.dto.Ets405rFormBean["reportName"])
at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:79) [jackson-databind-2.2.3.jar:]

Root Cause
This exception means that there are get and set methods of an object in your class and Jackson is unable to figure out during serialization and deserialization process.

Solution
Apply @JsonIgnore on getter method, i.e. getReportName
1:   /**  
2:     * Gets the report name.  
3:     *   
4:     * @return the reportName  
5:     */  
6:    @JsonIgnore  
7:    public String getReportName() {  
8:      return reportName;  
9:    }  

2013/10/17

Windows 無法自動偵測此網路的proxy設定


今天在公司,突然電腦無法上網,出現 "Windows 無法自動偵測此網路的proxy設定 (Windows could not automatically detect this network's proxy settings)"此錯誤訊息
檢查了網路孔沒問題、ip相關設定沒問題,也重開機了,還是無法上網

最後 Google 到兩個指令,依照以下四步驟就可以解決了(只是還是不知道原因是什麼):

  1. 打開命令提示字元 (open command line)
  2. 執行 netsh winsock reset (execute netsh winsock reset)
  3. 執行 netsh int ipv4 reset (execute netsh int ipv4 reset)
  4. 重開機 (reboot)


Reference:http://answers.microsoft.com/en-us/windows/forum/windows_7-networking/windows-could-not-automatically-detect-this/d243dea1-d1c8-4c4a-ba96-2b49bc9bab1a

2013/09/24

How to Change User in TortoiseSVN

Question
When I authenticate with a Subversion server, the username and password are cached locally so I don't have to keep entering them each time. But I would like to clear username and password data for some reasons, how do I do?

Answer
1. Right Click --> Settings

2. Choose "Saved Data", then click "Clear" button which besides Authentication data. It clear all authentication data, then you can enter another username and password.


2013/09/03

SP2-0734: unknown command beginning "alter tab..." - rest of line ignored.

Problem
I would like to execute a SQL script file with simple alter table script  as follows:

But it showed this error message:
1:  SQL*Plus: Release 11.2.0.2.0 Production on Tue Sep 3 08:03:36 2013  
2:  Copyright (c) 1982, 2010, Oracle. All rights reserved.  
3:  Connected to:  
4:  Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production  
5:  With the Partitioning, Oracle Label Security and Oracle Database Vault options  
6:  SP2-0734: unknown command beginning "alter tab..." - rest of line ignored.  
7:  SQL> Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.2.0  
8:  - 64bit Production  


With the Partitioning, Oracle Label Security and Oracle Database Vault options

Root Cause
It resulted from the SQL file has BOM character:
Solution
What you need to do is to convert the encoding of SQL file to UTF-8 without BOM and execute again, then this problem will be resolved.

2013/08/28

Utilize ime-mode property to Control Input Method Editor

Problem
Customer asked to control textfield1 can only fill in alphanumeric, textfield2 can fill in alphanumeric and Tranditional Chinese

Solution
We can use ime-mode CSS property to controls the state of the input method editor for text fields.

The default value of ime-mode property is auto, it means "no change is made to the current input method editor state".

If you would like to disable input method editor to allow for numbers and alphabets only, set the property of ime-mode property to "disabled".


If you would like to activate input method editor to allow for numbers, alphabets, and Tranditional Chinese, set the property of ime-mode property to "active".


Demo


Pay attention to some properties do not be supported by specific browser.

Reference: https://developer.mozilla.org/en-US/docs/Web/CSS/ime-mode

2013/07/24

ORA-01452: cannot CREATE UNIQUE INDEX;

Problem
As DBA rebuilt index, it produced error report as following:

Root Cause
Based on the NIGT021 schema, it only has one primary key. Therefore, it may has abnormal and duplicate data in NIGT021.

Solution
1. Figure out abnormal data
2. Delete abnormal data
3. rebuild index

Here is the SQL statement template to find duplicate value in this table
   select column_name, count(column_name)
   from [table]
   group by column_name
   having count (column_name) > 1;
Here is an example to apply to NIGT021
   select pnsh_tp, count(pnsh_tp)
   from nigt021
   group by pnsh_tp
   having count (pnsh_tp) > 1;

2013/06/22

2013/06 高雄

85大樓


俯瞰高雄港


愛河夜景


駁二特區

2013/05/24

Utilize SVN relocate to change repository's root URL

Problem
Administrator changed the location of repository for some reason. The content of the repository doesn't change, but the repository's root URL does.
If we utilized old URL, it will show failed error message as bellows:

Solution
We can use "SVN relocate" to change the repository's root URL.
Step1. Right Click --> TortoiseSVN -->Relocate

Step2. Change the repository's root URL, and click OK

Then you will get successful dialog as bellows:

Finally, we do SVN update to test if it works or not