MDA/MDD/TDD/DDD/DDDDDDD
posts - 536, comments - 111, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

1,
一个需求, 要求报表生成的Excel表格支持超链接。例如点击Excel内的公司名, 自动打开浏览器并连到该公司的网站上去。在Excel里面选中所需的单元格, 右键弹出属性, 选超链接就能输入相应的地址了,既然Excel支持超链接。那就没有什么借口说不能实现了。:).

翻了翻POI的文档, 很容易就找到了解决方案。在POI中让单元格实现超链接功能, 可以用Hyperlink 函数。HYPERLINK函数包含两个参数,第一个参数是指向的地址,第二个参数是显示的字符串

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

现在超链接单元格看起来和一般的单元格没有分别, 除非你把鼠标放上去才会变成手行光标。 为了和一般的习惯相符, 还需要把字符颜色变成蓝色和加上下划线。 这就要用到 style了、

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

最后把style应用到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,现在想对一个excel中的一组sheet做一个索引,方便查找每张sheet,
String outputFile="D:/导出接口.xls";
try
{
Workbook wb=Workbook.getWorkbook(new File(outputFile)); //Excel获得文件
//打开一个文件的副本,并且指定数据写回到原文件
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来实现基于Excel的数据模板输出,其中利用公式的方式嵌入超链接进行网页链接访问。  
  自己做了一些处理EXCEL单元格的方法,但在进行公式处理时,由于POI的问题,显示的公式信息一直都是乱码,后来在网上找到一些朋友关于这些问题的解 决方法,感觉帮助很大。因此,结合自己的实践经验,把修改POI内部源码的过程写出来,以其对资料做一整理,希望对后来的朋友也有所帮助。  
   
  1、首先,上网找到POI的发布版本的源码,我下的是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、至此对源文件的修改就结束了,下一步则需要对其进行编译输出。  
  7、利用docs/howtobuild.html的描述进行编译输出。  

后注:按上面的办法,中文问题是解决了,但点击链接还是报"引用无效",观察了一会,原来是sheet名带有括号造成的。
 

posted @ 2008-10-21 22:11 leekiang 阅读(4383) | 评论 (1)编辑 收藏

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

posted @ 2008-10-21 22:07 leekiang 阅读(5462) | 评论 (3)编辑 收藏

我们自己写了一个Grid。 其中一个功能是根据每列的数据, 计算出每一列的最小宽度, 然后用 style="width:90px" 的方式Render出来。 其中涉及到根据每一行字符串的长度转换成Pixel。然后取最大值。

具体的转换关系是:
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。

转自:http://sunnylei2008.blogspot.com/2007/09/blog-post_1295.html

posted @ 2008-10-21 22:04 leekiang 阅读(622) | 评论 (0)编辑 收藏

1,SQL Pretty Printer
能对sql进行各种格式化。
有多种版本。可安装使用,也可使用在线版:
http://www.wangz.net/cgi-bin/pp/gsqlparser/sqlpp/sqlformat.tpl

posted @ 2008-10-21 21:59 leekiang 阅读(167) | 评论 (0)编辑 收藏

TPS 是Transactions Per Second 的 缩 写, 也 就 是 事 务 数/ 秒。 它 是软件测试结 果 的 测 量 单 位。 一 个 事 务 是 指 一 个 客 户 机 向 服 务 器 发 送 请 求 然 后 服 务 器 做 出 反 应 的 过 程。 客 户 机 在 发 送 请 求 时 开 始 计 时, 收 到 服 务 器 响 应 后 结 束 计 时, 以 此 来 计 算 使 用 的 时 间 和 完 成 的 事 务 个 数, 最 终 利 用 这 些 信 息 来 估 计 得 分。 客 户 机 使 用 加 权 协 函 数 平 均 方 法 来 计 算 客 户 机 的得 分,测试软件就是 利 用 客 户 机 的 这 些 信 息 使 用 加 权 协 函 数 平 均 方 法 来 计 算 服 务 器 端 的 整 体TPS 得 分。

posted @ 2008-10-21 13:55 leekiang 阅读(835) | 评论 (0)编辑 收藏

离线并发的来源

         Web 项目中,离线并发显得尤其严重。例如,用户 A 和用户 B 同时修改数据库中的某张表的 R 行,加入 R 行有两个字段分别是 C1 C2

         假如按照如下过程修改:

         1 用户 A 将数据 R C1,C2 )读取到 A 的浏览器中。

         2 用户 B 将数据 R C1,C2 )读取到 B 的浏览器中。

         3 用户 A 在浏览器上将数据修改为 R C1’ C2 ),同时更新到数据库。

         4 用户 B 在浏览器上将数据修改为 R C1 C2’ ),同时更新到数据库。

        

         上述过程存在两个问题,第一,第 4 B 在修改数据的时候数据库中的数据和 B 的浏览器中数据已经不一致了;第二,如果程序按照哪个字段变化在数据库中更新哪个字段的方式处理的话,那么经过上述四步修改,数据库中 R 行的内容是( C1’,C2’ ),这和 A 或者 B 的想法都不同( A 认为是( C1’ C2 ), B 认为是( C1 C2’ ))。

 

         上述过程中 A 对数据库的修改过程或者 B 对数据库的修改过程,都是无法根据数据库的最新内容做修改,所以成为离线。 A B 同时对记录 R 进行就该叫离线。

         以上的环境叫离线并发。

         那么如何解决离线并发过程中遇到的问题呢?我们引入锁机制。

锁机制

         锁机制,就是在需要修改的数据上加互斥锁,通过互斥锁避免数据被同时修改。锁机制更具其应用环境又分为乐观锁悲观锁

         乐观锁

乐观锁,指认为冲突很少发生,所以只是在数据修改的时候比较修改的基础数据和数据库中的数据是否相同,相同则修改,否则提示用户重新装入数据库中已经变化的数据。

实现方法 1 :在进行 update 的时候使用 where 条件,在 Where 标间中比较所有上一步中查询得到的数据。如果数据库中的数据没有变化,则 update 可以更新到内容,否则 update 语句不能更新到内容,可以根据 update 的返回值确定更新是否成功。

实现方法 2 :在每一个表中追加一个特殊字段,类型为 timestamp ,每次更新的时候比较这个字段的值是否一致,如果一致,则更新,同时将这个字段更新为当前时间,否则,说明数据已经变更。这也可以使用 update 加上 where 实现。

         悲观锁

悲观锁指,需要修改的数据,在读取的时候就对数据加锁,其他用户在准备修改,读取数据的阶段判断数据是否上锁,以此来决定是否进行修改前的读操作。

                  实现方法:

                   通常在数据库中建立一张 lock 表,该表的字段包括,表明,唯一索引,时间,用户信息等。

在用户读取数据准备修改的时候,首先判断 lock 表中是否存在自己将要读取的数据。

如果不存在,则在 lock 表中添加一条记录,记录对那张表的哪行数据进行修改;如果存在,在判断时间字段是否超时。

如果超时,则更新 lock 表中本条记录的时间字段。(防止死锁的必要手段)

如果存在,也不超时,说明本条记录正在被其他用户修改,则返回并发信息。

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

posted @ 2008-10-19 00:51 leekiang 阅读(706) | 评论 (0)编辑 收藏

python处理字符串很容易,但是在处理中文时候需要注意一些问题。
比如:

a = "我们是python爱好者"
print a[0]

只能输出“我”字的前半部分,要想输出整个的我字还需要

b = a[0:2]
print b

才行,很不方便,并且当一段文本中同时有中英文?氖焙蚝苣汛怼?
最好的办法就是转换为unicode。

像这样:

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

这个时候c的下标对应的就是每一字,不再是字节,并且通过 len(c) 就可以获得字数!
还可以很方便的转换为其他编码,比如转换为 utf-8

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

转自 http://www.okpython.com/bbs/viewthread.php?tid=311

posted @ 2008-10-09 21:46 leekiang 阅读(1193) | 评论 (0)编辑 收藏

1,周转件:周转材料是可以重复使用的物资,如模板、脚手架等
2,物资计价方式一般有3种:移动平均,加权平均,先进先出。
   先进先出时最终肯定能保证入库金额-出库金额=库存余额,不会因为四舍五入导致数据不一致。原因在于:如果同一批次分多次领,最后一次领时肯定是把所有的余额全部领走。
3,
采用先进先出时,物资种类表里的物资单价,会随着该物资的每一次入库或者出库而变动,这个单价只能供参考,没有实际意义。

4,先进先出模式时,允许手动选择某个批次出库。
而移动平均时,
物资单价会随着该物资的每一次入库而变动。这时应该不允许手动选择某个批次出库了,否则想不清该怎么计算。

5,http://www.chinasbz.com/accountant/girl.asp?id=1241
月末一次加权平均法
加权平均法也叫全月一次加权平均法,指以本月收入全部存货数量加月初存货数量作为权数,去除本月收入全部存货成本加月初存货成本的和,计算出存货的加权平均单位成本,从而确定存货的发出成本和库存成本的方法。计算公式如下:
 加权平均单价=(本月收入全部存货数量加+月初存货数量)/(本月收入全部存货成本+月初存货成本)
本月发出存货成本=本月发出存货数量×加权平均单价
月末结存存货成本=月末库存存货数量×加权平均单价

移动加权平均法。
移动平均法亦称移动加权平均法,指本次收货的成本加原有库存的成本,除以本次收货数量加原有存货数量,据以计算加权平均单价,并对发出存货进行计价的一种方 法。移动平均法与加权平均法的计算原理基本相同,不同的是加权平均法一个月计算一次单位成本,而移动平均法每收进一次存货,就计算一次单位成本。计算公式 如下:
移动平均单价=(本次进货的成本+原有库存的成本)/(本次进货数量+原有存货数量)
本批发出存货成本=本批发出存货数量x存货当前移动平均单价

这样看来,我认为物资系统才用加权平均来计价就不合适了,因为领料时的价格肯定是马上要确定的,而如果采用加权平均,当月领料的价格要到下月初才知道。

10,其他有用的帖子
http://topic.csdn.net/u/20070112/09/f04597db-1a99-467c-940e-d0d0a608c1fa.html
新会计准则取消了后进先出(LIFO)和移动加权平均,只能使用FIFO和标准成本?
计划价与移动加权平均,他人之体会

posted @ 2008-10-09 16:13 leekiang 阅读(293) | 评论 (0)编辑 收藏

1,批量修改明细时要判断主单的状态是否允许,可用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,查找某些字段重复的记录,可先对那几个字段分组,然后看个数,个数大于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 阅读(181) | 评论 (0)编辑 收藏

 

posted @ 2008-10-08 18:39 leekiang 阅读(185) | 评论 (0)编辑 收藏

仅列出标题
共54页: First 上一页 30 31 32 33 34 35 36 37 38 下一页 Last