MDA/MDD/TDD/DDD/DDDDDDD
          posts - 536, comments - 111, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          1,
          一個需求, 要求報表生成的Excel表格支持超鏈接。例如點擊Excel內(nèi)的公司名, 自動打開瀏覽器并連到該公司的網(wǎng)站上去。在Excel里面選中所需的單元格, 右鍵彈出屬性, 選超鏈接就能輸入相應(yīng)的地址了,既然Excel支持超鏈接。那就沒有什么借口說不能實現(xiàn)了。:).

          翻了翻POI的文檔, 很容易就找到了解決方案。在POI中讓單元格實現(xiàn)超鏈接功能, 可以用Hyperlink 函數(shù)。HYPERLINK函數(shù)包含兩個參數(shù),第一個參數(shù)是指向的地址,第二個參數(shù)是顯示的字符串

          cell = row.createCell(colNumber)。
          cell.setCellType(HSSFCell.CELL_TYPE_FORMULA);
          cell.setCellFormula("HYPERLINK(\"" + "Http://www.google.ca"+ "\",\"" + "Google Canada"+ "\")");
          或cell.setCellFormula("HYPERLINK(\"[workbook.xls]'sheet2'!A1\",\"homepage\")"); //HYPERLINK("#明細!A1","homepage"),#代表本工作簿,來源http://club.excelhome.net/thread-54081-1-1.html

          現(xiàn)在超鏈接單元格看起來和一般的單元格沒有分別, 除非你把鼠標放上去才會變成手行光標。 為了和一般的習慣相符, 還需要把字符顏色變成藍色和加上下劃線。 這就要用到 style了、

          HSSFCellStyle linkStyle = workbook.createCellStyle();
          HSSFFont cellFont= workbook.createFont();
          cellFont.setUnderline((byte) 1);
          cellFont.setColor(HSSFColor.BLUE.index);
          linkStyle.setFont(cellFont);

          最后把style應(yīng)用到cell上去就大功告成了。
          cell.setCellStyle(linkStyle);

          以上修改自http://sunnylei2008.blogspot.com/2007/07/poihssf.html
          和http://diystyle.javaeye.com/blog/132093
          還有http://blog.csdn.net/xunyiren/archive/2007/03/08/1524533.aspx

          2,
          以下來自http://www.javaeye.com/topic/25569,是用jxl解決的。
          看了POI文檔,找到一個LinkedDataFormulaField 和LinkedDataRecord,jxl文檔里有 Hyperlink,現(xiàn)在想對一個excel中的一組sheet做一個索引,方便查找每張sheet,
          String outputFile="D:/導出接口.xls";
          try
          {
          Workbook wb=Workbook.getWorkbook(new File(outputFile)); //Excel獲得文件
          //打開一個文件的副本,并且指定數(shù)據(jù)寫回到原文件
          WritableWorkbook book=Workbook.createWorkbook(new File(outputFile),wb);
          WritableSheet sheet=book.createSheet("導出目標",0); //添加一個工作表
          String[] oriSheetNames=wb.getSheetNames();? //獲得源excel文件中的所有sheet名稱
          ?for(int i=0;i<book.getNumberOfSheets();i++)
          ?{
          ??? sheet.addCell(new Label(0,i+1,String.valueOf(i+1)));? //第一列寫入編號
          /**
          * public WritableHyperlink(int col,int row,java.lang.String desc,WritableSheet sheet,int destcol,int destrow)
          * Constructs a hyperlink to some cells within this workbook
          * col - the column containing this hyperlink
          * row - the row containing this hyperlink
          * desc - the cell contents for this hyperlink
          * sheet - the sheet containing the cells to be linked to
          * destcol - the column number of the first destination linked cell
          * destrow - the row number of the first destination linked cell
          * */
          sheet.addHyperlink(new WritableHyperlink(1,i+1,oriSheetNames[i],book.getSheet(oriSheetNames[i]),0,0));
          book.write();
          book.close();
          wb.close();
          }catch(IOException e)
          {
          ??? System.out.println("異常: "+e);
          }
          catch(BiffException e)
          {
          ??? System.out.println("異常: "+e);
          }
          catch(RowsExceededException e)
          {
          ??? System.out.println("異常: "+e);
          }
          catch(WriteException e)
          {
          ??? System.out.println("異常: "+e);
          }

          3,公式里的亂碼如何解決,來源:http://topic.csdn.net/t/20060309/10/4602637.html,作者阿水
          前幾天做項目的過程中,利用到Apache項目中的POI來實現(xiàn)基于Excel的數(shù)據(jù)模板輸出,其中利用公式的方式嵌入超鏈接進行網(wǎng)頁鏈接訪問。 ?
          ? 自己做了一些處理EXCEL單元格的方法,但在進行公式處理時,由于POI的問題,顯示的公式信息一直都是亂碼,后來在網(wǎng)上找到一些朋友關(guān)于這些問題的解 決方法,感覺幫助很大。因此,結(jié)合自己的實踐經(jīng)驗,把修改POI內(nèi)部源碼的過程寫出來,以其對資料做一整理,希望對后來的朋友也有所幫助。 ?
          ? ?
          ? 1、首先,上網(wǎng)找到POI的發(fā)布版本的源碼,我下的是poi-src-2.5.1-final-20040804.zip這個版本。 ?
          ? 2、找到StringPtg.java這個文件,在解壓后的\src\java\org\apache\poi\hssf\record\formula文件夾下面 ?
          ? 3、利用文本編輯工具對StringPtg.java進行編輯 ?
          ? 4、找到public ? StringPtg(byte ? [] ? data, ? int ? offset)這個方法, ?
          ? 對其修改如下 ?
          ? /** ? Create ? a ? StringPtg ? from ? a ? byte ? array ? read ? from ? disk ? */ ?
          ? ? ? ? ? public ? StringPtg(byte ? [] ? data, ? int ? offset) ?
          ? ? ? ? ? { ?
          ? ? ? ? ? ? ? ? ? offset++; ?
          ? ? ? ? ? ? ? ? ? field_1_length ? = ? data[offset]; ?
          ? ? ? ? ? ? ? ? ? field_2_options ? = ? data[offset+1]; ?
          ? ? ? ? ? ? ? ? ? if ? (fHighByte.isSet(field_2_options)) ? { ?
          ? ? ? ? ? ? ? ? ? ? ? ? ? // ? modified ? by ? rainsoft ? ?
          ? ? ? ? ? ? ? ? ? ? ? ? ? // ? in ? excel ? chinese ? is ? stored ? two ? bytes ? HIGH ? bytes,LOW ? bytes ?
          ? ? ? ? ? ? ? ? ? ? ? ? ? // ? field_3_string= ? StringUtil.getFromUnicode(data,offset+2,field_1_length); ?
          ? ? ? ? ? ? ? ? ? ? ? ? ? field_3_string= ? StringUtil.getFromUnicodeHigh(data,offset+2,field_1_length); ?
          ? ? ? ? ? ? ? ? ? }else ? { ?
          ? ? ? ? ? ? ? ? ? ? ? ? ? field_3_string=StringUtil.getFromCompressedUnicode(data,offset+2,field_1_length); ?
          ? ? ? ? ? ? ? ? ? } ?
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
          ? ? ? ? ? ? ? ? ? //setValue(new ? String(data, ? offset+3, ? data[offset+1] ? + ? 256*data[offset+2])); ?
          ? ? ? ? ? } ?
          ? 其中主要利用getFromUnicodeHigh方法替換原有的方法進行處理。 ?
          ? 5、再查找StringPtg(String ? value),做如下的修改, ?
          ? ?
          ? public ? StringPtg(String ? value) ? { ?
          ? ? ? ? ? ? ? ? ? if ? (value.length() ? >255) ? { ?
          ? ? ? ? ? ? ? ? ? ? ? ? ? throw ? new ? IllegalArgumentException("String ? literals ? in ? formulas ? cant ? be ? bigger ? than ? 255 ? characters ? ASCII"); ?
          ? ? ? ? ? ? ? ? ? } ?
          ? ? ? ? ? ? ? ? ? this.field_2_options=0; ?
          ? ? ? ? ? ? ? ? ? // ? add ? by ? rainsoft ?
          ? ? ? ? ? ? ? ? ? // ? two ? bytes ? char ? options ? must ? be ? "1" ? ? ? ? ? ? ?
          ? ? ? ? ? ? ? ? ? try ? { ?
          ? ? ? ? ? ? ? ? ? ? ? if ? (value.length()!=value.getBytes("GBK").length) ?
          ? ? ? ? ? ? ? ? ? ? ? ? ? this.field_2_options=1; ?
          ? ? ? ? ? ? ? ? ? } ? catch ? (Exception ? e) ? { ?
          ? ? ? ? ? ? ? ? ? } ?
          ? ? ? ? ? ? ? ? ? // ? end ? add ?
          ? ? ? ? ? ? ? ? ? this.fHighByte.setBoolean(field_2_options, ? false); ?
          ? ? ? ? ? ? ? ? ? this.field_3_string=value; ?
          ? ? ? ? ? ? ? ? ? this.field_1_length=(byte)value.length(); ? //for ? the ? moment, ? we ? support ? only ? ASCII ? strings ? in ? formulas ? we ? create ?
          ? ? ? ? ? } ?
          ? ?
          ? 6、至此對源文件的修改就結(jié)束了,下一步則需要對其進行編譯輸出。 ?
          ? 7、利用docs/howtobuild.html的描述進行編譯輸出。 ?

          后注:按上面的辦法,中文問題是解決了,但點擊鏈接還是報"引用無效",觀察了一會,原來是sheet名帶有括號造成的。
          ?

          posted @ 2008-10-21 22:11 leekiang 閱讀(4429) | 評論 (1)編輯 收藏

          http://www.fileformat.info/tool/regex.htm

          posted @ 2008-10-21 22:07 leekiang 閱讀(5490) | 評論 (3)編輯 收藏

          我們自己寫了一個Grid。 其中一個功能是根據(jù)每列的數(shù)據(jù), 計算出每一列的最小寬度, 然后用 style="width:90px" 的方式Render出來。 其中涉及到根據(jù)每一行字符串的長度轉(zhuǎn)換成Pixel。然后取最大值。

          具體的轉(zhuǎn)換關(guān)系是:
          1 point = 1/72 inch
          1 pixel = 0.75 points.

          那么一個character 是多少Pixels呢? 答案是這條公式: (Column Width) Pixels = Column Width (Characters) × 5 + 5。


          例如 "Hello World" 是 11×5+5=60 Pixels。

          轉(zhuǎn)自:http://sunnylei2008.blogspot.com/2007/09/blog-post_1295.html

          posted @ 2008-10-21 22:04 leekiang 閱讀(646) | 評論 (0)編輯 收藏

          1,SQL Pretty Printer
          能對sql進行各種格式化。
          有多種版本??砂惭b使用,也可使用在線版:
          http://www.wangz.net/cgi-bin/pp/gsqlparser/sqlpp/sqlformat.tpl

          posted @ 2008-10-21 21:59 leekiang 閱讀(183) | 評論 (0)編輯 收藏

          TPS 是Transactions Per Second 的 縮 寫, 也 就 是 事 務(wù) 數(shù)/ 秒。 它 是軟件測試結(jié) 果 的 測 量 單 位。 一 個 事 務(wù) 是 指 一 個 客 戶 機 向 服 務(wù) 器 發(fā) 送 請 求 然 后 服 務(wù) 器 做 出 反 應(yīng) 的 過 程。 客 戶 機 在 發(fā) 送 請 求 時 開 始 計 時, 收 到 服 務(wù) 器 響 應(yīng) 后 結(jié) 束 計 時, 以 此 來 計 算 使 用 的 時 間 和 完 成 的 事 務(wù) 個 數(shù), 最 終 利 用 這 些 信 息 來 估 計 得 分。 客 戶 機 使 用 加 權(quán) 協(xié) 函 數(shù) 平 均 方 法 來 計 算 客 戶 機 的得 分,測試軟件就是 利 用 客 戶 機 的 這 些 信 息 使 用 加 權(quán) 協(xié) 函 數(shù) 平 均 方 法 來 計 算 服 務(wù) 器 端 的 整 體TPS 得 分。

          posted @ 2008-10-21 13:55 leekiang 閱讀(885) | 評論 (0)編輯 收藏

          離線并發(fā)的來源

          ???????? Web 項目中,離線并發(fā)顯得尤其嚴重。例如,用戶 A 和用戶 B 同時修改數(shù)據(jù)庫中的某張表的 R 行,加入 R 行有兩個字段分別是 C1 , C2 。

          ???????? 假如按照如下過程修改:

          ???????? 1 用戶 A 將數(shù)據(jù) R C1,C2 )讀取到 A 的瀏覽器中。

          ???????? 2 用戶 B 將數(shù)據(jù) R C1,C2 )讀取到 B 的瀏覽器中。

          ???????? 3 用戶 A 在瀏覽器上將數(shù)據(jù)修改為 R C1’ , C2 ),同時更新到數(shù)據(jù)庫。

          ???????? 4 用戶 B 在瀏覽器上將數(shù)據(jù)修改為 R C1 C2’ ),同時更新到數(shù)據(jù)庫。

          ????????

          ???????? 上述過程存在兩個問題,第一,第 4 B 在修改數(shù)據(jù)的時候數(shù)據(jù)庫中的數(shù)據(jù)和 B 的瀏覽器中數(shù)據(jù)已經(jīng)不一致了;第二,如果程序按照哪個字段變化在數(shù)據(jù)庫中更新哪個字段的方式處理的話,那么經(jīng)過上述四步修改,數(shù)據(jù)庫中 R 行的內(nèi)容是( C1’,C2’ ),這和 A 或者 B 的想法都不同( A 認為是( C1’ C2 ), B 認為是( C1 , C2’ ))。

          ?

          ???????? 上述過程中 A 對數(shù)據(jù)庫的修改過程或者 B 對數(shù)據(jù)庫的修改過程,都是無法根據(jù)數(shù)據(jù)庫的最新內(nèi)容做修改,所以成為離線。 A B 同時對記錄 R 進行就該叫離線。

          ???????? 以上的環(huán)境叫離線并發(fā)。

          ???????? 那么如何解決離線并發(fā)過程中遇到的問題呢?我們引入鎖機制。

          鎖機制

          ???????? 鎖機制,就是在需要修改的數(shù)據(jù)上加互斥鎖,通過互斥鎖避免數(shù)據(jù)被同時修改。鎖機制更具其應(yīng)用環(huán)境又分為樂觀鎖悲觀鎖

          ???????? 樂觀鎖

          樂觀鎖,指認為沖突很少發(fā)生,所以只是在數(shù)據(jù)修改的時候比較修改的基礎(chǔ)數(shù)據(jù)和數(shù)據(jù)庫中的數(shù)據(jù)是否相同,相同則修改,否則提示用戶重新裝入數(shù)據(jù)庫中已經(jīng)變化的數(shù)據(jù)。

          實現(xiàn)方法 1 :在進行 update 的時候使用 where 條件,在 Where 標間中比較所有上一步中查詢得到的數(shù)據(jù)。如果數(shù)據(jù)庫中的數(shù)據(jù)沒有變化,則 update 可以更新到內(nèi)容,否則 update 語句不能更新到內(nèi)容,可以根據(jù) update 的返回值確定更新是否成功。

          實現(xiàn)方法 2 :在每一個表中追加一個特殊字段,類型為 timestamp ,每次更新的時候比較這個字段的值是否一致,如果一致,則更新,同時將這個字段更新為當前時間,否則,說明數(shù)據(jù)已經(jīng)變更。這也可以使用 update 加上 where 實現(xiàn)。

          ???????? 悲觀鎖

          悲觀鎖指,需要修改的數(shù)據(jù),在讀取的時候就對數(shù)據(jù)加鎖,其他用戶在準備修改,讀取數(shù)據(jù)的階段判斷數(shù)據(jù)是否上鎖,以此來決定是否進行修改前的讀操作。

          ???????? ???????? 實現(xiàn)方法:

          ?????????????????? 通常在數(shù)據(jù)庫中建立一張 lock 表,該表的字段包括,表明,唯一索引,時間,用戶信息等。

          在用戶讀取數(shù)據(jù)準備修改的時候,首先判斷 lock 表中是否存在自己將要讀取的數(shù)據(jù)。

          如果不存在,則在 lock 表中添加一條記錄,記錄對那張表的哪行數(shù)據(jù)進行修改;如果存在,在判斷時間字段是否超時。

          如果超時,則更新 lock 表中本條記錄的時間字段。(防止死鎖的必要手段)

          如果存在,也不超時,說明本條記錄正在被其他用戶修改,則返回并發(fā)信息。

          出處:http://blog.csdn.net/struts2/archive/2007/08/14/1742686.aspx

          posted @ 2008-10-19 00:51 leekiang 閱讀(723) | 評論 (0)編輯 收藏

          python處理字符串很容易,但是在處理中文時候需要注意一些問題。
          比如:

          a = "我們是python愛好者"
          print a[0]

          只能輸出“我”字的前半部分,要想輸出整個的我字還需要

          b = a[0:2]
          print b

          才行,很不方便,并且當一段文本中同時有中英文?氖焙蠔苣汛懟?
          最好的辦法就是轉(zhuǎn)換為unicode。

          像這樣:

          c = unicode(a, "gb2312")
          print c[0]

          這個時候c的下標對應(yīng)的就是每一字,不再是字節(jié),并且通過 len(c) 就可以獲得字數(shù)!
          還可以很方便的轉(zhuǎn)換為其他編碼,比如轉(zhuǎn)換為 utf-8

          d = c.encode("utf-8")

          轉(zhuǎn)自 http://www.okpython.com/bbs/viewthread.php?tid=311

          posted @ 2008-10-09 21:46 leekiang 閱讀(1214) | 評論 (0)編輯 收藏

          1,周轉(zhuǎn)件:周轉(zhuǎn)材料是可以重復使用的物資,如模板、腳手架等
          2,物資計價方式一般有3種:移動平均,加權(quán)平均,先進先出。
          ?? 先進先出時最終肯定能保證入庫金額-出庫金額=庫存余額,不會因為四舍五入導致數(shù)據(jù)不一致。原因在于:如果同一批次分多次領(lǐng),最后一次領(lǐng)時肯定是把所有的余額全部領(lǐng)走。
          3,
          采用先進先出時,物資種類表里的物資單價,會隨著該物資的每一次入庫或者出庫而變動,這個單價只能供參考,沒有實際意義。

          4,先進先出模式時,允許手動選擇某個批次出庫。
          而移動平均時,
          物資單價會隨著該物資的每一次入庫而變動。這時應(yīng)該不允許手動選擇某個批次出庫了,否則想不清該怎么計算。

          5,http://www.chinasbz.com/accountant/girl.asp?id=1241
          月末一次加權(quán)平均法
          加權(quán)平均法也叫全月一次加權(quán)平均法,指以本月收入全部存貨數(shù)量加月初存貨數(shù)量作為權(quán)數(shù),去除本月收入全部存貨成本加月初存貨成本的和,計算出存貨的加權(quán)平均單位成本,從而確定存貨的發(fā)出成本和庫存成本的方法。計算公式如下:
          ?加權(quán)平均單價=(本月收入全部存貨數(shù)量加+月初存貨數(shù)量)/(本月收入全部存貨成本+月初存貨成本)
          本月發(fā)出存貨成本=本月發(fā)出存貨數(shù)量×加權(quán)平均單價
          月末結(jié)存存貨成本=月末庫存存貨數(shù)量×加權(quán)平均單價

          移動加權(quán)平均法。
          移動平均法亦稱移動加權(quán)平均法,指本次收貨的成本加原有庫存的成本,除以本次收貨數(shù)量加原有存貨數(shù)量,據(jù)以計算加權(quán)平均單價,并對發(fā)出存貨進行計價的一種方 法。移動平均法與加權(quán)平均法的計算原理基本相同,不同的是加權(quán)平均法一個月計算一次單位成本,而移動平均法每收進一次存貨,就計算一次單位成本。計算公式 如下:
          移動平均單價=(本次進貨的成本+原有庫存的成本)/(本次進貨數(shù)量+原有存貨數(shù)量)
          本批發(fā)出存貨成本=本批發(fā)出存貨數(shù)量x存貨當前移動平均單價

          這樣看來,我認為物資系統(tǒng)才用加權(quán)平均來計價就不合適了,因為領(lǐng)料時的價格肯定是馬上要確定的,而如果采用加權(quán)平均,當月領(lǐng)料的價格要到下月初才知道。

          10,其他有用的帖子
          http://topic.csdn.net/u/20070112/09/f04597db-1a99-467c-940e-d0d0a608c1fa.html
          新會計準則取消了后進先出(LIFO)和移動加權(quán)平均,只能使用FIFO和標準成本?
          計劃價與移動加權(quán)平均,他人之體會

          posted @ 2008-10-09 16:13 leekiang 閱讀(314) | 評論 (0)編輯 收藏

          1,批量修改明細時要判斷主單的狀態(tài)是否允許,可用exists變通解決
          ?

          update TB_DETAIL d

          ??????? set d.flag= 1,

          ?????????? d.enabletime=sysdate

          ????? where d.testfield='AAA' and

          exists (select *

          ?????????????? from TB_DETAIL tempd

          ?????????????? left join TB_MAIN m on tempd.mainid = m.mainid

          ????????????? where m.status = 'true'

          ??????????????? and tempd.detailid = d.detailid);

          2,查找某些字段重復的記錄,可先對那幾個字段分組,然后看個數(shù),個數(shù)大于1的就說明有重復。但這樣查出的是所有重復的記錄,如果不想重復,再distinct一下
          ??? --如:查找stuid重復的記錄
            select * from stuinfo
            where stuid in (
            select stuid from stuinfo
            group by stuid
            having(count(*))>1
            )
          ? 參考

          posted @ 2008-10-08 19:19 leekiang 閱讀(192) | 評論 (0)編輯 收藏

          ?

          posted @ 2008-10-08 18:39 leekiang 閱讀(207) | 評論 (0)編輯 收藏

          僅列出標題
          共54頁: First 上一頁 30 31 32 33 34 35 36 37 38 下一頁 Last 
          主站蜘蛛池模板: 谢通门县| 天镇县| 普格县| 昌图县| 菏泽市| 竹北市| 卢湾区| 广饶县| 祁连县| 互助| 湟中县| 喀喇沁旗| 庆云县| 赤水市| 永昌县| 闸北区| 台前县| 南丰县| 长春市| 平阳县| 旅游| 林芝县| 平昌县| 邵武市| 高阳县| 西吉县| 开封市| 卢龙县| 什邡市| 辽源市| 普宁市| 高清| 高淳县| 隆子县| 昌宁县| 嘉兴市| 威海市| 疏附县| 张掖市| 班玛县| 汽车|