<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>laowood</title>
    <description>不要小看我,别问我有几两重.</description>
    <link>http://laowood.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>C# 写Excel 代码</title>
        <author>laowood</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://laowood.javaeye.com">laowood</a>&nbsp;
          链接：<a href="http://laowood.javaeye.com/blog/230652" style="color:red;">http://laowood.javaeye.com/blog/230652</a>&nbsp;
          发表时间: 2008年08月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="color: #0000ff;"><span style="color: #000000;">C# 中使用 Excel </span></span></p>
<p><span style="color: #0000ff;">using</span><span style="color: #000000;"> System;<br /></span><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Collections.Generic;<br /></span><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Text;<br /></span><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Reflection;<br /></span><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Runtime.InteropServices;<br /></span><span style="color: #0000ff;">using</span><span style="color: #000000;"> Microsoft.Office.Interop.Excel;<br /></span><span style="color: #0000ff;">using</span><span style="color: #000000;"> ExcelApplication </span><span style="color: #000000;">=</span><span style="color: #000000;"> Microsoft.Office.Interop.Excel.ApplicationClass;<br /><br /></span><span style="color: #0000ff;">namespace</span><span style="color: #000000;"> ExcalDemo<br /></span><span style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span><span style="color: #000000;">{<br /></span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> ExcelFiles<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span><span style="color: #000000;">{<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> CreateExcelFiles()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span><span style="color: #000000;">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">创建一个 Excel 实例</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ExcelApplication excel </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> ExcelApplication();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span><span style="color: #000000;">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 注释掉的语句是:从磁盘指定位置打开一个 Excel 文件<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">excel.Workbooks.Open("demo.xls", Missing.Value, Missing.Value, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">Missing.Value,Missing.Value, Missing.Value, Missing.Value, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">Missing.Value, Missing.Value, Missing.Value, Missing.Value, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">Missing.Value, Missing.Value, Missing.Value, Missing.Value);</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; excel.Visible </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">false</span><span style="color: #000000;">;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 不显示 Excel 文件,如果为 true 则显示 Excel 文件</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; excel.Workbooks.Add(Missing.Value);</span><span style="color: #008000;">//</span><span style="color: #008000;"> 添加工作簿</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Worksheet sheet </span><span style="color: #000000;">=</span><span style="color: #000000;"> (Worksheet)excel.ActiveSheet;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 获取当前工作表</span><span style="color: #008000;"><br /></span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Range range </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">null</span><span style="color: #000000;">;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 创建一个空的单元格对象</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sheet.get_Range(sheet.Cells[29,2],sheet.Cells[29,2]).Orientation=Excel.XlOrientation.xlVertical;//字体竖直居中在单元格内<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; range </span><span style="color: #000000;">=</span><span style="color: #000000;"> sheet.get_Range(</span><span style="color: #000000;">"</span><span style="color: #000000;">A1</span><span style="color: #000000;">"</span><span style="color: #000000;">, Missing.Value);</span><span style="color: #008000;">//</span><span style="color: #008000;"> 获取单个单元格</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; range.RowHeight </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">20</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置行高</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; range.ColumnWidth </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">20</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置列宽</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; range.Borders.LineStyle </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置单元格边框</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; range.Font.Bold </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">true</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 加粗字体</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; range.Font.Size </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">20</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置字体大小</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; range.Font.ColorIndex </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">5</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置字体颜色</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; range.Interior.ColorIndex </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">6</span><span style="color: #000000;">;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置单元格背景色</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; range.HorizontalAlignment </span><span style="color: #000000;">=</span><span style="color: #000000;"> XlHAlign.xlHAlignCenter;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置单元格水平居中</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; range.VerticalAlignment </span><span style="color: #000000;">=</span><span style="color: #000000;"> XlVAlign.xlVAlignCenter;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置单元格垂直居中</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; range.Value2 </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">设置行高和列宽</span><span style="color: #000000;">"</span><span style="color: #000000;">;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置单元格的值</span></span></span></span></span></p>
<p><span><span><span><span><span style="color: #008000;"><span><span><span><span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; range </span><span style="color: #000000;">=</span><span style="color: #000000;"> sheet.get_Range(</span><span style="color: #000000;">"</span><span style="color: #000000;">B2</span><span style="color: #000000;">"</span><span style="color: #000000;">, </span><span style="color: #000000;">"</span><span style="color: #000000;">D4</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span><span style="color: #008000;">//</span><span style="color: #008000;"> 获取多个单元格</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; range.Merge(Missing.Value);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 合并单元格</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; range.Columns.AutoFit();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置列宽为自动适应</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; range.NumberFormatLocal </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">#,##0.00</span><span style="color: #000000;">"</span><span style="color: #000000;">;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置单元格格式为货币格式<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置单元格左边框加粗</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; range.Borders[XlBordersIndex.xlEdgeLeft].Weight </span><span style="color: #000000;">=</span><span style="color: #000000;"> XlBorderWeight.xlThick;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置单元格右边框加粗</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; range.Borders[XlBordersIndex.xlEdgeRight].Weight </span><span style="color: #000000;">=</span><span style="color: #000000;"> XlBorderWeight.xlThick;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; range.Value2 </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">合并单元格</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 页面设置</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sheet.PageSetup.PaperSize </span><span style="color: #000000;">=</span><span style="color: #000000;"> XlPaperSize.xlPaperA4;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置页面大小为A4</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sheet.PageSetup.Orientation </span><span style="color: #000000;">=</span><span style="color: #000000;"> XlPageOrientation.xlPortrait; </span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置垂直版面</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sheet.PageSetup.HeaderMargin </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">0.0</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置页眉边距</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sheet.PageSetup.FooterMargin </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">0.0</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置页脚边距</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sheet.PageSetup.LeftMargin </span><span style="color: #000000;">=</span><span style="color: #000000;"> excel.InchesToPoints(</span><span style="color: #000000;">0.354330708661417</span><span style="color: #000000;">); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置左边距</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sheet.PageSetup.RightMargin </span><span style="color: #000000;">=</span><span style="color: #000000;"> excel.InchesToPoints(</span><span style="color: #000000;">0.354330708661417</span><span style="color: #000000;">);</span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置右边距</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sheet.PageSetup.TopMargin </span><span style="color: #000000;">=</span><span style="color: #000000;"> excel.InchesToPoints(</span><span style="color: #000000;">0.393700787401575</span><span style="color: #000000;">);&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置上边距</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sheet.PageSetup.BottomMargin </span><span style="color: #000000;">=</span><span style="color: #000000;"> excel.InchesToPoints(</span><span style="color: #000000;">0.393700787401575</span><span style="color: #000000;">);</span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置下边距</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sheet.PageSetup.CenterHorizontally </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">true</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置水平居中<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 打印文件</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sheet.PrintOut(Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 保存文件到程序运行目录下</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sheet.SaveAs(System.Windows.Forms.Application.StartupPath </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">\demo.xls</span><span style="color: #000000;">"</span><span style="color: #000000;">, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; excel.ActiveWorkbook.Close(</span><span style="color: #0000ff;">false</span><span style="color: #000000;">, </span><span style="color: #0000ff;">null</span><span style="color: #000000;">, </span><span style="color: #0000ff;">null</span><span style="color: #000000;">); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 关闭 Excel 文件且不保存</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception ex)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span><span style="color: #000000;">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox.Show(ex.Message);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">finally</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span><span style="color: #000000;">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; excel.Quit(); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 退出 Excel</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; excel </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">null</span><span style="color: #000000;">; </span><span style="color: #008000;">//</span><span style="color: #008000;"> 将 Excel 实例设置为空<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 即便是这样, 有时在系统任务管理器中仍能看到一个 Excel 进程, 但有时也看不到<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 据非权威人事说,这是 Office 2003 的 Bug. 这个问题有待与考证.</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;"><br />}</span></span></span></span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception ex)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span><span style="color: #000000;">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox.Show(ex.Message);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">finally</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span><span style="color: #000000;">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; excel.Quit(); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 退出 Excel</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; excel </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">null</span><span style="color: #000000;">; </span><span style="color: #008000;">//</span><span style="color: #008000;"> 将 Excel 实例设置为空<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 即便是这样, 有时在系统任务管理器中仍能看到一个 Excel 进程, 但有时也看不到<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 据非权威人事说,这是 Office 2003 的 Bug. 这个问题有待与考证.</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;"><br />}</span></span></p>
<p><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; range </span><span style="color: #000000;">=</span><span style="color: #000000;"> sheet.get_Range(</span><span style="color: #000000;">"</span><span style="color: #000000;">B2</span><span style="color: #000000;">"</span><span style="color: #000000;">, </span><span style="color: #000000;">"</span><span style="color: #000000;">D4</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span><span style="color: #008000;">//</span><span style="color: #008000;"> 获取多个单元格</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; range.Merge(Missing.Value);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 合并单元格</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; range.Columns.AutoFit();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置列宽为自动适应</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; range.NumberFormatLocal </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">#,##0.00</span><span style="color: #000000;">"</span><span style="color: #000000;">;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置单元格格式为货币格式<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置单元格左边框加粗</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; range.Borders[XlBordersIndex.xlEdgeLeft].Weight </span><span style="color: #000000;">=</span><span style="color: #000000;"> XlBorderWeight.xlThick;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置单元格右边框加粗</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; range.Borders[XlBordersIndex.xlEdgeRight].Weight </span><span style="color: #000000;">=</span><span style="color: #000000;"> XlBorderWeight.xlThick;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; range.Value2 </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">合并单元格</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 页面设置</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sheet.PageSetup.PaperSize </span><span style="color: #000000;">=</span><span style="color: #000000;"> XlPaperSize.xlPaperA4;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置页面大小为A4</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sheet.PageSetup.Orientation </span><span style="color: #000000;">=</span><span style="color: #000000;"> XlPageOrientation.xlPortrait; </span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置垂直版面</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sheet.PageSetup.HeaderMargin </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">0.0</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置页眉边距</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sheet.PageSetup.FooterMargin </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">0.0</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置页脚边距</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sheet.PageSetup.LeftMargin </span><span style="color: #000000;">=</span><span style="color: #000000;"> excel.InchesToPoints(</span><span style="color: #000000;">0.354330708661417</span><span style="color: #000000;">); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置左边距</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sheet.PageSetup.RightMargin </span><span style="color: #000000;">=</span><span style="color: #000000;"> excel.InchesToPoints(</span><span style="color: #000000;">0.354330708661417</span><span style="color: #000000;">);</span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置右边距</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sheet.PageSetup.TopMargin </span><span style="color: #000000;">=</span><span style="color: #000000;"> excel.InchesToPoints(</span><span style="color: #000000;">0.393700787401575</span><span style="color: #000000;">);&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置上边距</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sheet.PageSetup.BottomMargin </span><span style="color: #000000;">=</span><span style="color: #000000;"> excel.InchesToPoints(</span><span style="color: #000000;">0.393700787401575</span><span style="color: #000000;">);</span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置下边距</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sheet.PageSetup.CenterHorizontally </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">true</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置水平居中<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 打印文件</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sheet.PrintOut(Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 保存文件到程序运行目录下</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sheet.SaveAs(System.Windows.Forms.Application.StartupPath </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">\demo.xls</span><span style="color: #000000;">"</span><span style="color: #000000;">, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; excel.ActiveWorkbook.Close(</span><span style="color: #0000ff;">false</span><span style="color: #000000;">, </span><span style="color: #0000ff;">null</span><span style="color: #000000;">, </span><span style="color: #0000ff;">null</span><span style="color: #000000;">); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 关闭 Excel 文件且不保存</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>运行环境: Microsoft Office Excel 2003 + Microsoft Visual Studio 2005</p>
<p>1. 为项目添加 COM 组件的引用<br />方法如下:<br />项目 -&gt; 添加引用 -&gt; com -&gt; Microsoft Excel Object 11.0 Object Library -&gt; 确定<br />此时项目里会增加 3 个引用, 分别是: Excel、Microsoft.Office.Core、VBIDE</p>
<p>2. 在类文件里添加如下命名空间的引用<br />using System.Reflection;<br />using System.Runtime.InteropServices;<br />using Microsoft.Office.Interop.Excel;</p>
<p>using ExcelApplication = Microsoft.Office.Interop.Excel.ApplicationClass; //为了与 System.Windows.Forms 命名空间下的 Application 类有所区分, 纯属方便代码的编写.</p>
<p>注: 最好不要用在窗体类中使用. 因为,当引入 Microsoft.Office.Interop.Excel 命名空间后, Microsoft.Office.Interop.Excel 命名空间下的 Application 接口会同 System.Windows.Forms 命名空间下的 Application 类产生二义性冲突. 要使用 Application 类, 就必须在 Application 前面添加完整的命名空间名.</p>
<p>经过以上 2 步的操作就可以使用 Excel 了. 但是, 关于 Excel 的 MSDN 很少, 多数都是 English 的. 这样对使用 Excel 带来了不便. 想调整单元格的大小都十分困难. 这里我告诉大家一个简单实用的笨方法. 那就是: 打开你的 Excel, 录制宏. 然后根据生成的 VB 代码, 去到 MSDN 里查相关 C# 的帮助.</p>
          <br/>
          <span style="color:red;">
            <a href="http://laowood.javaeye.com/blog/230652#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 20 Aug 2008 12:48:21 +0800</pubDate>
        <link>http://laowood.javaeye.com/blog/230652</link>
        <guid>http://laowood.javaeye.com/blog/230652</guid>
      </item>
      <item>
        <title>[精华]Linux记事本最常用的命令,迅速掌握Linux</title>
        <author>laowood</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://laowood.javaeye.com">laowood</a>&nbsp;
          链接：<a href="http://laowood.javaeye.com/blog/208898" style="color:red;">http://laowood.javaeye.com/blog/208898</a>&nbsp;
          发表时间: 2008年06月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          自己整理的笔记,,适合linux初学者,老手就不要看了,呵呵<br /><br /><br />vi #进入或者建立一个文本文件<br />eg:vi test  #进入或建立test<br /><br />在文本文件里有两种模式<br />编辑模式 和 命令模式 <br />从命令模式进入编辑模式可以有四种<br />i,a,o,O<br />i,向当前光标所在位置前插入字符<br />a,向当前光标所在位置后插入字符<br />o,向当前光标所在位置上插入字符<br />O,向当年光标所在位置下插入字符<br /><br />从编辑进入命令模式 按Esc<br />命令模式下 <br />:w 保存<br />:q 退出<br />:q! 不保存退出<br />/ 查找字符<br />n 查找下一个字符<br />:3 定位到第三行<br />:$ 定位到段末<br />shift+$ 行头<br />shift+^ 行尾<br />r 替换字符<br />cw 替换单词<br />. 重复<br />ctrl+f 上<br />ctrl+b 下<br />yy 复制 eg:'3 yy' 复制三行<br />p 粘贴到光标的下面 <br />P 粘贴到光标的上面<br />dd 删除行<br />dword 删除单词
          <br/>
          <span style="color:red;">
            <a href="http://laowood.javaeye.com/blog/208898#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 28 Jun 2008 09:51:00 +0800</pubDate>
        <link>http://laowood.javaeye.com/blog/208898</link>
        <guid>http://laowood.javaeye.com/blog/208898</guid>
      </item>
      <item>
        <title>Java移动文件</title>
        <author>laowood</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://laowood.javaeye.com">laowood</a>&nbsp;
          链接：<a href="http://laowood.javaeye.com/blog/203299" style="color:red;">http://laowood.javaeye.com/blog/203299</a>&nbsp;
          发表时间: 2008年06月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一：<br /> //文件原地址 <br /> File oldFile = new File("c:/test.xls"); <br /> //文件新（目标）地址 <br /> String newPath = "c:/test/"; <br /> //new一个新文件夹 <br /> File fnewpath = new File(newPath); <br /> //判断文件夹是否存在 <br /> if(!fnewpath.exists()) <br /> fnewpath.mkdirs(); <br /> //将文件移到新文件里 <br /> File fnew = new File(newPath +oldFile.getName()); <br /> oldFile.renameTo(fnew); <br /><br />二：（使用ｊａｖａ复制移动文件 ）<br />   /**<br />      * Moving a File to Another Directory<br />      * @param srcFile  eg: c:\windows\abc.txt<br />      * @param destPath eg: c:\temp<br />      * @return success <br />      */<br />     public static boolean move(String srcFile, String destPath){<br />  // File (or directory) to be moved<br />  File file = new File(srcFile);<br />  <br />  // Destination directory<br />  File dir = new File(destPath);<br />  <br />  // Move file to new directory<br />  boolean success = file.renameTo(new File(dir, file.getName()));<br />  <br />  return success;<br />     }<br /><br />三：(ｊａｖａ删除 移动文件)<br /> File f=new File("c:\\Autoexec.bat");<br /> f.renameTo("d:\\Autoexec.bat");//移动<br /> f.delete();//删除<br /><br /> import ｊａｖａ.io.*;<br /><br /> public class MoveFile {<br />      public static void main(String[] args)throws IOException{<br />      File f=new File("d:\\myHomework\\Work");<br />      File fileList[]=f.listFiles();<br />      for(int i=0;i&lt;fileList.length ;i++) {<br />   fileList[i].renameTo(new File("d:\\myHomework\\Backup\\" + fileList[i].getName()));<br />     }<br /> }<br /> <br />四：ｊａｖａ操作文件(创建,删除,复制,剪切）<br /><br />package OALogic.sql.data;<br />import ｊａｖａ.io.*; <br /><br />public class FileOperate { <br />   public FileOperate() { <br />   } <br />   <br />   public static void main(String args[]){<br />       newFolder("D:/100");<br /><br />   }<br /><br />   /** <br />     * 新建目录 <br />     * @param folderPath String 如 c:/fqf <br />     * @return boolean <br />     */ <br />   public static void newFolder(String folderPath) { <br />       try { <br />           String filePath = folderPath; <br />           filePath = filePath.toString(); <br />           ｊａｖａ.io.File myFilePath = new ｊａｖａ.io.File(filePath); <br />           if (!myFilePath.exists()) { <br />               myFilePath.mkdir(); <br />           } <br />       } <br />       catch (Exception e) { <br />           System.out.println("新建目录操作出错"); <br />           e.printStackTrace(); <br />       } <br />   } <br /><br />   /** <br />     * 新建文件 <br />     * @param filePathAndName String 文件路径及名称 如c:/fqf.txt <br />     * @param fileContent String 文件内容 <br />     * @return boolean <br />     */ <br />   public static void newFile(String filePathAndName, String fileContent) { <br /><br />       try { <br />           String filePath = filePathAndName; <br />           filePath = filePath.toString(); <br />           File myFilePath = new File(filePath); <br />           if (!myFilePath.exists()) { <br />               myFilePath.createNewFile(); <br />           } <br />           FileWriter resultFile = new FileWriter(myFilePath); <br />           PrintWriter myFile = new PrintWriter(resultFile); <br />           String strContent = fileContent; <br />           myFile.println(strContent); <br />           resultFile.close(); <br /><br />       } <br />       catch (Exception e) { <br />           System.out.println("新建目录操作出错"); <br />           e.printStackTrace(); <br /><br />       } <br /><br />   } <br /><br />   /** <br />     * 删除文件 <br />     * @param filePathAndName String 文件路径及名称 如c:/fqf.txt <br />     * @param fileContent String <br />     * @return boolean <br />     */ <br />   public static void delFile(String filePathAndName) { <br />       try { <br />           String filePath = filePathAndName; <br />           filePath = filePath.toString(); <br />           ｊａｖａ.io.File myDelFile = new ｊａｖａ.io.File(filePath); <br />           myDelFile.delete(); <br /><br />       } <br />       catch (Exception e) { <br />           System.out.println("删除文件操作出错"); <br />           e.printStackTrace(); <br /><br />       } <br /><br />   } <br /><br />   /** <br />     * 删除文件夹 <br />     * @param filePathAndName String 文件夹路径及名称 如c:/fqf <br />     * @param fileContent String <br />     * @return boolean <br />     */ <br />   public static void delFolder(String folderPath) { <br />       try { <br />           delAllFile(folderPath); //删除完里面所有内容 <br />           String filePath = folderPath; <br />           filePath = filePath.toString(); <br />           ｊａｖａ.io.File myFilePath = new ｊａｖａ.io.File(filePath); <br />           myFilePath.delete(); //删除空文件夹 <br /><br />       } <br />       catch (Exception e) { <br />           System.out.println("删除文件夹操作出错"); <br />           e.printStackTrace(); <br /><br />       } <br /><br />   } <br /><br />   /** <br />     * 删除文件夹里面的所有文件 <br />     * @param path String 文件夹路径 如 c:/fqf <br />     */ <br />   public static void delAllFile(String path) { <br />       File file = new File(path); <br />       if (!file.exists()) { <br />           return; <br />       } <br />       if (!file.isDirectory()) { <br />           return; <br />       } <br />       String[] tempList = file.list(); <br />       File temp = null; <br />       for (int i = 0; i &lt; tempList.length; i++) { <br />           if (path.endsWith(File.separator)) { <br />               temp = new File(path + tempList[i]); <br />           } <br />           else { <br />               temp = new File(path + File.separator + tempList[i]); <br />           } <br />           if (temp.isFile()) { <br />               temp.delete(); <br />           } <br />           if (temp.isDirectory()) { <br />               delAllFile(path+"/"+ tempList[i]);//先删除文件夹里面的文件 <br />               delFolder(path+"/"+ tempList[i]);//再删除空文件夹 <br />           } <br />       } <br />   } <br /><br />   /** <br />     * 复制单个文件 <br />     * @param oldPath String 原文件路径 如：c:/fqf.txt <br />     * @param newPath String 复制后路径 如：f:/fqf.txt <br />     * @return boolean <br />     */ <br />   public static void copyFile(String oldPath, String newPath) { <br />       try { <br />           int bytesum = 0; <br />           int byteread = 0; <br />           File oldfile = new File(oldPath); <br />           if (oldfile.exists()) { //文件存在时 <br />               ｉｎｐｕｔStream inStream = new FileｉｎｐｕｔStream(oldPath); //读入原文件 <br />               FileOutputStream fs = new FileOutputStream(newPath); <br />               byte[] buffer = new byte[1444]; <br />               int length; <br />               while ( (byteread = inStream.read(buffer)) != -1) { <br />                   bytesum += byteread; //字节数 文件大小 <br />                   System.out.println(bytesum); <br />                   fs.write(buffer, 0, byteread); <br />               } <br />               inStream.close(); <br />           } <br />       } <br />       catch (Exception e) { <br />           System.out.println("复制单个文件操作出错"); <br />           e.printStackTrace(); <br /><br />       } <br /><br />   } <br /><br />   /** <br />     * 复制整个文件夹内容 <br />     * @param oldPath String 原文件路径 如：c:/fqf <br />     * @param newPath String 复制后路径 如：f:/fqf/ff <br />     * @return boolean <br />     */ <br />   public static void copyFolder(String oldPath, String newPath) { <br /><br />       try { <br />           (new File(newPath)).mkdirs(); //如果文件夹不存在 则建立新文件夹 <br />           File a=new File(oldPath); <br />           String[] file=a.list(); <br />           File temp=null; <br />           for (int i = 0; i &lt; file.length; i++) { <br />               if(oldPath.endsWith(File.separator)){ <br />                   temp=new File(oldPath+file[i]); <br />               } <br />               else{ <br />                   temp=new File(oldPath+File.separator+file[i]); <br />               } <br /><br />               if(temp.isFile()){ <br />                   FileｉｎｐｕｔStream ｉｎｐｕｔ = new FileｉｎｐｕｔStream(temp); <br />                   FileOutputStream output = new FileOutputStream(newPath + "/" + <br />                           (temp.getName()).toString()); <br />                   byte[] b = new byte[1024 * 5]; <br />                   int len; <br />                   while ( (len = ｉｎｐｕｔ.read(b)) != -1) { <br />                       output.write(b, 0, len); <br />                   } <br />                   output.flush(); <br />                   output.close(); <br />                   ｉｎｐｕｔ.close(); <br />               } <br />               if(temp.isDirectory()){//如果是子文件夹 <br />                   copyFolder(oldPath+"/"+file[i],newPath+"/"+file[i]); <br />               } <br />           } <br />       } <br />       catch (Exception e) { <br />           System.out.println("复制整个文件夹内容操作出错"); <br />           e.printStackTrace(); <br /><br />       } <br /><br />   } <br /><br />   /** <br />     * 移动文件到指定目录 <br />     * @param oldPath String 如：c:/fqf.txt <br />     * @param newPath String 如：d:/fqf.txt <br />     */ <br />   public static void moveFile(String oldPath, String newPath) { <br />       copyFile(oldPath, newPath); <br />       delFile(oldPath); <br /><br />   } <br /><br />   /** <br />     * 移动文件到指定目录 <br />     * @param oldPath String 如：c:/fqf.txt <br />     * @param newPath String 如：d:/fqf.txt <br />     */ <br />   public static void moveFolder(String oldPath, String newPath) { <br />       copyFolder(oldPath, newPath); <br />       delFolder(oldPath); <br /><br />   } <br />}
          <br/>
          <span style="color:red;">
            <a href="http://laowood.javaeye.com/blog/203299#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 14 Jun 2008 19:50:01 +0800</pubDate>
        <link>http://laowood.javaeye.com/blog/203299</link>
        <guid>http://laowood.javaeye.com/blog/203299</guid>
      </item>
      <item>
        <title>大道至简-java之23种模式一点就通</title>
        <author>laowood</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://laowood.javaeye.com">laowood</a>&nbsp;
          链接：<a href="http://laowood.javaeye.com/blog/202399" style="color:red;">http://laowood.javaeye.com/blog/202399</a>&nbsp;
          发表时间: 2008年06月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一、创建型模式 <br /><br />FACTORY?人才市场：以往是要哪个人才，就找哪个人才，效率低，现在有了人才市场，我们只需直接去人才市场挑一个好了； <br /><br />BUILDER?生产流水线：以前是手工业作坊式的人工单个单个的生产零件然后一步一步组装做，好比有了工业革命，现在都由生产流水线代替了。如要造丰田汽车，先制定汽车的构造如由车胎、方向盘、发动机组成。再以此构造标准生产丰田汽车的车胎、方向盘、发动机。然后进行组装。最后得到丰田汽车； <br /><br />PROTOTYPE?印刷术的发明：以前只能临贴才能保持和别人的字迹基本相同，直从印刷技术发明，从而保证了复制得和原物一模一样； <br /><br />SINGLETON?唯一：以前是商标满天飞，相同的商标难免造成侵权，直从有商标保护法后，就保证了不会再产生第家企业使用相同的商标； <br /><br /><br />二、结构型模式 <br /><br />ADAPTER?集众人之私，成一己之公：武当派张三丰会太极拳，少林派智空大师会金刚般若掌，如果他们两个都成为我的师傅，我就既会太极拳，又会金刚般若掌了； <br /><br />DECORATOR?青出于蓝而胜于蓝：武当派张三丰会太极拳，是我师傅，他教会了我太极拳，但我自己还会点蒙古式摔交，张三丰却不会。于是我就成了DECORATOR模式的实现； <br /><br />BRIDGE?白马非马：马之颜色有黑白，马之性别有公母。我们说"这是马"太抽象，说"这是黑色的公马"又太死板，只有将颜色与性别和马动态组合，"这是（黑色的或白色的）（公或母）马"才显得灵活而飘逸，如此bridge模式精髓得矣。 <br /><br />COMPOS99vE?大家族：子又生孙，孙又生子，子子孙孙，无穷尽也，将众多纷杂的人口组织成一个按辈分排列的大家族即是此模式的实现； <br /><br />FACADE?求同存异：高中毕业需读初中和高中，博士也需读初中和高中，因此国家将初中和高中普及成九年制义务教育； <br /><br />FLYWEIGHT?一劳永逸：认识三千汉字，可以应付日常读书与写字，可见头脑中存在这个汉字库的重要； <br /><br />PROXY?垂帘听政：犹如清朝康熙年间的四大府臣，很多权利不在皇帝手里，必须通过辅佐大臣去办； <br /><br /><br />三、行为模式 <br /><br />CHAIN OF RESPONSIBLE99vY?租房：以前为了找房到处打听，效率低且找不到好的房源。现在有了房屋中介，于是向房屋中介提出租房请求，中介提供一个合适的房源，满意则不再请求，不满意继续看房，直到满意为止； <br /><br />COMMAND?借刀杀人：以前是想杀谁就杀，但一段时间后领悟到，长此以往必将结仇太多，于是假手他人，挑拨他人之间的关系从而达到自己的目的； <br /><br />INTERPRETER?文言文注释：一段文言文，将它翻译成白话文； <br /><br />99vERATOR?赶尽杀绝：一个一个的搜索，绝不放掉一个； <br /><br />MEDIATOR?三角债：本来千头万绪的债务关系，忽出来一中介，包揽其一切，于是三角关系变成了独立的三方找第四方中介的关系； <br /><br />MEMENTO?有福同享：我有多少，你就有多少； <br /><br />OBSERVER?看守者：一旦被看守者有什么异常情况，定会及时做出反应； <br /><br />STATE?进出自由：如一扇门，能进能出，如果有很多人随时进进出出必定显得杂乱而安全，如今设一保安限制其进出，如此各人进出才显得规范； <br /><br />STRATEGY?久病成良医：如人生病可以有各种症状，但经过长期摸索，就可以总结出感冒、肺病、肝炎等几种； <br /><br /><br />TEMPLATE METHOD??理论不一定要实践：教练的学生会游泳就行了，至于教练会不会则无关紧要； <br /><br />VIS99vOR?依法治罪：因张三杀人要被处死，李四偷窃要被罚款。由此势必制定处罚制度，故制定法律写明杀人、放火、偷窃等罪要受什么处罚，经通过后须变动要小。今后有人犯罪不管是谁，按共条例处罚即是，这就是访问者模式诞生的全过程。
          <br/>
          <span style="color:red;">
            <a href="http://laowood.javaeye.com/blog/202399#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 12 Jun 2008 10:23:02 +0800</pubDate>
        <link>http://laowood.javaeye.com/blog/202399</link>
        <guid>http://laowood.javaeye.com/blog/202399</guid>
      </item>
      <item>
        <title>C# 操作Excel </title>
        <author>laowood</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://laowood.javaeye.com">laowood</a>&nbsp;
          链接：<a href="http://laowood.javaeye.com/blog/191381" style="color:red;">http://laowood.javaeye.com/blog/191381</a>&nbsp;
          发表时间: 2008年05月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近经常写导出报表的软件<br />所以对Excel操作算是了解的差不多了<br />拿来与大家分享一下 <br /><br /><br />Excel.Application Excelapp =new Excel.Application();<br />Excelapp.Visible=false;<br />Excel._Workbook uniteExcel=null;<br />try<br />{<br />//创建一个Excel<br />uniteExcel = (Excel._Workbook)(Excelapp.Workbooks.Add( Missing.Value));<br />//打开一个EXCEL<br />Excel.Workbook currentExcel= Excelapp.Workbooks.Open("Excel.xls",Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);<br />//Excel里的sheet<br />Excel._Worksheet currentSheet=(Excel._Worksheet)currentExcel.Sheets[1];<br /><br />uniteSheet1.Cells[1,1]="TEST"//操作表格<br /><br /><br /><br />//sheet style<br />			uniteSheet1.get_Range(uniteSheet1.Cells[2,1],uniteSheet1.Cells[15,18]).Font.Size=10;<br /><br />			uniteSheet1.get_Range(uniteSheet1.Cells[4,1],uniteSheet1.Cells[4,18]).RowHeight=30;<br /><br />			uniteSheet1.get_Range(uniteSheet1.Cells[3,1],uniteSheet1.Cells[3,18]).RowHeight=30;<br /><br />			uniteSheet1.get_Range(uniteSheet1.Cells[1,1],uniteSheet1.Cells[15,1]).ColumnWidth=5;<br /><br />			uniteSheet1.get_Range(uniteSheet1.Cells[1,2],uniteSheet1.Cells[15,2]).ColumnWidth=15;<br /><br />			uniteSheet1.get_Range(uniteSheet1.Cells[1,11],uniteSheet1.Cells[15,11]).ColumnWidth=10;<br /><br />			uniteSheet1.get_Range(uniteSheet1.Cells[1,14],uniteSheet1.Cells[15,14]).ColumnWidth=10;<br /><br />			uniteSheet1.get_Range(uniteSheet1.Cells[2,3],uniteSheet1.Cells[4,6]).Interior.ColorIndex=27;<br /><br />			uniteSheet1.get_Range(uniteSheet1.Cells[2,7],uniteSheet1.Cells[4,15]).Interior.ColorIndex=38;<br /><br />			uniteSheet1.get_Range(uniteSheet1.Cells[2,16],uniteSheet1.Cells[4,18]).Interior.ColorIndex=35;<br /><br />			uniteSheet1.get_Range(uniteSheet1.Cells[5,1],uniteSheet1.Cells[14,2]).Interior.ColorIndex=33;<br /><br />			uniteSheet1.get_Range(uniteSheet1.Cells[15,1],uniteSheet1.Cells[15,1]).Interior.ColorIndex=33;<br /><br />			uniteSheet1.get_Range(uniteSheet1.Cells[15,2],uniteSheet1.Cells[15,18]).Interior.ColorIndex=15;<br /><br />			uniteSheet1.UsedRange.Borders[Excel.XlBordersIndex.xlInsideHorizontal].ColorIndex = Excel.XlColorIndex.xlColorIndexAutomatic;<br /><br />			uniteSheet1.UsedRange.Borders[Excel.XlBordersIndex.xlInsideHorizontal].LineStyle =Excel.XlLineStyle.xlContinuous;<br />				<br />			uniteSheet1.UsedRange.Borders[Excel.XlBordersIndex.xlInsideHorizontal].Weight =Excel.XlBorderWeight.xlThin;<br /><br />			uniteSheet1.UsedRange.Borders[Excel.XlBordersIndex.xlInsideVertical].ColorIndex = Excel.XlColorIndex.xlColorIndexAutomatic;<br /><br />			uniteSheet1.UsedRange.Borders[Excel.XlBordersIndex.xlInsideVertical].LineStyle =Excel.XlLineStyle.xlContinuous;<br />				<br />			uniteSheet1.UsedRange.Borders[Excel.XlBordersIndex.xlInsideVertical].Weight =Excel.XlBorderWeight.xlThin;<br /><br />			uniteSheet1.UsedRange.Borders[Excel.XlBordersIndex.xlEdgeRight].ColorIndex = Excel.XlColorIndex.xlColorIndexAutomatic;<br /><br />			uniteSheet1.UsedRange.Borders[Excel.XlBordersIndex.xlEdgeRight].LineStyle =Excel.XlLineStyle.xlContinuous;<br />				<br />			uniteSheet1.UsedRange.Borders[Excel.XlBordersIndex.xlEdgeRight].Weight =Excel.XlBorderWeight.xlThin;<br /><br />			uniteSheet1.UsedRange.Borders[Excel.XlBordersIndex.xlEdgeBottom].ColorIndex = Excel.XlColorIndex.xlColorIndexAutomatic;<br /><br />			uniteSheet1.UsedRange.Borders[Excel.XlBordersIndex.xlEdgeBottom].LineStyle =Excel.XlLineStyle.xlContinuous;<br />				<br />			uniteSheet1.UsedRange.Borders[Excel.XlBordersIndex.xlEdgeBottom].Weight =Excel.XlBorderWeight.xlThin;<br /><br /><br />uniteExcel.Saved =false; <br />				<br />uniteExcel.SaveCopyAs(savePath);<br /><br />}<br />catch(Exception ex)<br />{<br /><br />}<br />finally<br />{<br /><br />				System.Runtime.InteropServices.Marshal.ReleaseComObject(uniteSheet1);<br />				System.Runtime.InteropServices.Marshal.ReleaseComObject(uniteSheet2);<br />				System.Runtime.InteropServices.Marshal.ReleaseComObject(uniteSheet3);<br />				//System.Runtime.InteropServices.Marshal.ReleaseComObject(range);<br />				uniteExcel.Close(false,null,null);<br />				System.Runtime.InteropServices.Marshal.ReleaseComObject(uniteExcel);<br />				Excelapp.Quit();<br />				uniteSheet1=null;<br />				uniteSheet2=null;<br />				uniteSheet3=null;<br /><br />				GC.Collect();<br />				GC.WaitForPendingFinalizers();<br />				<br />				Excelapp=null;<br /><br />				killExcelProcess()<br />}<br /><br />Excel进程每次都关不掉，所以就拿出来杀手锏，不知道这样做好不好，但是肯定的是能用 呵呵<br />//结束 Excel 进程<br />foreach(System.Diagnostics.Process xlProcess in System.Diagnostics.Process.GetProcesses())<br />{<br />  if( xlProcess.ProcessName.ToUpper().Equals("EXCEL")) <br />  {<br />	xlProcess.Kill();<br />   }<br />}
          <br/>
          <span style="color:red;">
            <a href="http://laowood.javaeye.com/blog/191381#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 09 May 2008 12:49:29 +0800</pubDate>
        <link>http://laowood.javaeye.com/blog/191381</link>
        <guid>http://laowood.javaeye.com/blog/191381</guid>
      </item>
      <item>
        <title>LDAP     Weblogic和AD之间的通信</title>
        <author>laowood</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://laowood.javaeye.com">laowood</a>&nbsp;
          链接：<a href="http://laowood.javaeye.com/blog/168790" style="color:red;">http://laowood.javaeye.com/blog/168790</a>&nbsp;
          发表时间: 2008年03月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          LDAP是轻量目录访问协议，英文全称是Lightweight Directory Access Protocol，一般都简称为LDAP。它是基于X.500标准的，但是简单多了并且可以根据需要定制。与X.500不同，LDAP支持TCP/IP，这对访问Internet是必须的。LDAP的核心规范在RFC中都有定义，所有与LDAP相关的RFC都可以在LDAPman RFC网页中找到。<br />简单说来，LDAP是一个得到关于人或者资源的集中、静态数据的快速方式。<br />LDAP是一个用来发布目录信息到许多不同资源的协议。通常它都作为一个集中的地址本使用，不过根据组织者的需要，它可以做得更加强大。<br />LDAP其实是一电话簿，类似于我们所使用诸如NIS(Network Information Service)、DNS (Domain Name Service)等网络目录，也类似于你在花园中所看到的树木。<br />不少LDAP开发人员喜欢把LDAP与关系数据库相比，认为是另一种的存贮方式，然后在读性能上进行比较。实际上，这种对比的基础是错误的。LDAP和关系数据库是两种不同层次的概念，后者是存贮方式（同一层次如网格数据库，对象数据库），前者是存贮模式和访问协议。LDAP是一个比关系数据库抽象层次更高的存贮概念，与关系数据库的查询语言SQL属同一级别。LDAP最基本的形式是一个连接数据库的标准方式。该数据库为读查询作了优化。因此它可以很快地得到查询结果，不过在其它方面，例如更新，就慢得多。<br />从另一个意义上 LDAP是实现了指定的数据结构的存贮，它是一种特殊的数据库。但是LDAP和一般的数据库不同，明白这一点是很重要的。 LDAP对查询进行了优化，与写性能相比LDAP的读性能要优秀很多。<br />就象Sybase、Oracle、Informix或Microsoft的数据库管理系统（DBMS）是用于处理查询和更新关系型数据库那样，LDAP服务器也是用来处理查询和更新LDAP目录的。换句话来说LDAP目录也是一种类型的数据库，但不是关系型数据库。要特别注意的是，LDAP通常作为一个 hierarchal数据库使用，而不是一个关系数据库。因此，它的结构用树来表示比用表格好。正因为这样，就不能用SQL语句了。
          <br/>
          <span style="color:red;">
            <a href="http://laowood.javaeye.com/blog/168790#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 06 Mar 2008 15:35:01 +0800</pubDate>
        <link>http://laowood.javaeye.com/blog/168790</link>
        <guid>http://laowood.javaeye.com/blog/168790</guid>
      </item>
      <item>
        <title>spring是如何管理 事务的</title>
        <author>laowood</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://laowood.javaeye.com">laowood</a>&nbsp;
          链接：<a href="http://laowood.javaeye.com/blog/148835" style="color:red;">http://laowood.javaeye.com/blog/148835</a>&nbsp;
          发表时间: 2007年12月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          　　Spring提供的事务管理可以分为两类：编程式的和声明式的。编程式的，比较灵活，但是代码量大，存在重复的代码比较多；声明式的比编程式的更灵活方便。<br /><br />　　1、传统使用JDBC的事务管理<br /><br />　　以往使用JDBC进行数据操作，使用DataSource，从数据源中得到Connection，我们知道数据源是线程安全的，而连接不是线程安全的，所以对每个请求都是从数据源中重新取出一个连接。一般的数据源由容器进行管理，包括连接池。例如TOMCAT，WEBSPHERE，WEBLOGIC等这些J2EE商业容器都提供了这个功能。<br /><br />　　以往的我们使用JDBC在写代码时，事务管理可能会是这样：<br /><br />Connection conn = null;<br />try{<br />　conn = DBConnectionFactory.getConnection;<br />　conn.setAutoCommit(false);<br />　//do something<br />　conn.commit(); //commit transcation<br />}catch(Exception e){<br />　conn.rollback();<br />}<br />finally{<br />　try{<br />　　conn.close();<br />　} catch(SQLException se){ //do sth.}<br />　//close ResultSet,PreparedStatement,Connection <br />　//notice:Maybe ocurr Exception when u close rs,pstmt,conn<br />} <br /><br />　　按照以往的思路来写代码，代码量比较长，而且容易疏忽，忘掉一些try/catch，引发一些异常无法catch，虽然有时候我们会写DBTool类，来关闭这些资源，并且保证在关闭这些资源时，不向外抛异常，但是这样做会导致额外的麻烦。<br /><br />　　2、Spring提供的编程式的事务处理<br /><br />　　Spring提供了几个关于事务处理的类：TransactionDefinition //事务属性定义<br /><br />　　TranscationStatus //代表了当前的事务，可以提交，回滚。 <br /><br />　　PlatformTransactionManager这个是spring提供的用于管理事务的基础接口，其下有一个实现的抽象类AbstractPlatformTransactionManager，我们使用的事务管理类例如DataSourceTransactionManager等都是这个类的子类。<br /><br />　　我们使用编程式的事务管理流程可能如下：<br /><br />　　(1) 声明数据源。<br /><br />　　(2) 声明一个事务管理类，例如：DataSourceTransactionManager,HibernateTransactionManger,JTATransactionManager等<br /><br />　　(3) 在我们的代码中加入事务处理代码：<br /><br />TransactionDefinition td = new TransactionDefinition();<br />TransactionStatus ts = transactionManager.getTransaction(td);<br />try{<br />　//do sth<br />　transactionManager.commit(ts);<br />}catch(Exception e){transactionManager.rollback(ts);} <br /><br />　　使用Spring提供的事务模板TransactionTemplate：<br /><br />void add()<br />{<br />　transactionTemplate.execute( new TransactionCallback(){<br />　　pulic Object doInTransaction(TransactionStatus ts)<br />　　{ //do sth}<br />　}<br />} <br /><br />　　TransactionTemplate也是为我们省去了部分事务提交、回滚代码；定义事务模板时，需注入事务管理对象。<br /><br />　　3、Spring声明式事务处理<br /><br />　　Spring声明式事务处理也主要使用了IoC，AOP思想，提供了TransactionInterceptor拦截器和常用的代理类TransactionProxyFactoryBean，可以直接对组件进行事务代理。<br /><br />　　使用TransactionInterceptor的步骤：<br /><br />　　（1）定义数据源，事务管理类<br /><br />　　（2）定义事务拦截器,例如：<br /><br />＜bean id = "transactionInterceptor" <br />class="org.springframework.transaction.interceptor.TransactionInterceptor"＞<br />＜property name="transactionManager"＞＜ref bean="transactionManager"/＞＜/property＞<br />＜property name="transactionAttributeSource"＞<br />＜value＞<br />com.test.UserManager.*r=PROPAGATION_REQUIRED<br />＜/value＞<br />＜/property＞<br />＜/bean＞ <br /><br />　　（3）为组件声明一个代理类：ProxyFactoryBean<br /><br />＜bean id="userManager" class="org.springframework.aop.framework.ProxyFactoryBean"＞<br />＜property name="proxyInterfaces"＞＜value＞com.test.UserManager＜/value＞＜/property＞<br />＜property name="interceptorNames"＞<br />＜list＞<br />＜idref local="transactionInterceptor"/＞<br />＜/list＞<br />＜/property＞<br />＜/bean＞ <br /><br />　　使用TransactionProxyFactoryBean：<br /><br />＜bean id="userManager"<br />class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"＞<br />＜property name="transactionManager"＞＜ref bean="transactionManager"/＞＜/property＞<br />＜property name="target"＞＜ref local="userManagerTarget"/＞＜/property＞<br />＜property name="transactionAttributes"＞<br />＜props＞<br />＜prop key="insert*"＞PROPAGATION_REQUIRED＜/prop＞<br />＜prop key="update*"＞PROPAGATION_REQUIRED＜/prop＞<br />＜prop key="*"＞PROPAGATION_REQUIRED,readOnly＜/prop＞<br />＜/props＞<br />＜/property＞<br />＜/bean＞ <br /><br />　　TransactionProxyFactoryBean只是为组件的事务代理，如果我们要给组件添加一些业务方面的验证等，可以使用TransactionTemplate加拦截器方式，为组件添加多个拦截器，spring AOP中提供了三类Advice,即前增强，后增强，抛出异常时的增强，可以灵活使用。
          <br/>
          <span style="color:red;">
            <a href="http://laowood.javaeye.com/blog/148835#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 17 Dec 2007 12:31:01 +0800</pubDate>
        <link>http://laowood.javaeye.com/blog/148835</link>
        <guid>http://laowood.javaeye.com/blog/148835</guid>
      </item>
      <item>
        <title>分类设计元素</title>
        <author>laowood</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://laowood.javaeye.com">laowood</a>&nbsp;
          链接：<a href="http://laowood.javaeye.com/blog/135602" style="color:red;">http://laowood.javaeye.com/blog/135602</a>&nbsp;
          发表时间: 2007年10月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <table cellspacing="1" border="1" summary="" width="377" cellpadding="1" style="WIDTH: 377px; HEIGHT: 192px">
    <tbody>
        <tr>
            <td><strong>功能</strong></td>
            <td><font face="Comic Sans MS"><strong>元素</strong></font></td>
        </tr>
        <tr>
            <td>显示,收集和组织信息</td>
            <td>页面,表单和视图,文件夹</td>
        </tr>
        <tr>
            <td>自动功能</td>
            <td>代理,操作</td>
        </tr>
        <tr>
            <td>控制,导航</td>
            <td>热点,大纲,帧结构,导航器,图像映射</td>
        </tr>
    </tbody>
</table>
          <br/>
          <span style="color:red;">
            <a href="http://laowood.javaeye.com/blog/135602#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 26 Oct 2007 00:53:35 +0800</pubDate>
        <link>http://laowood.javaeye.com/blog/135602</link>
        <guid>http://laowood.javaeye.com/blog/135602</guid>
      </item>
      <item>
        <title>domino如何在数据库中存储信息</title>
        <author>laowood</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://laowood.javaeye.com">laowood</a>&nbsp;
          链接：<a href="http://laowood.javaeye.com/blog/135601" style="color:red;">http://laowood.javaeye.com/blog/135601</a>&nbsp;
          发表时间: 2007年10月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>domino数据库使用记录这种数据结构来存储所有信息.</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://laowood.javaeye.com/blog/135601#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 26 Oct 2007 00:41:51 +0800</pubDate>
        <link>http://laowood.javaeye.com/blog/135601</link>
        <guid>http://laowood.javaeye.com/blog/135601</guid>
      </item>
      <item>
        <title>domino数据库的组成部分 按功能</title>
        <author>laowood</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://laowood.javaeye.com">laowood</a>&nbsp;
          链接：<a href="http://laowood.javaeye.com/blog/135599" style="color:red;">http://laowood.javaeye.com/blog/135599</a>&nbsp;
          发表时间: 2007年10月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>notes存储工具(notes stoage facility ,NSF)保存应用程序中的数据和设计.</p>
<p>notes检索工具(notes indexfacility,NIF)在应用程序中创建和维护一个列表.此列表负责对数据信息定位.</p>
          <br/>
          <span style="color:red;">
            <a href="http://laowood.javaeye.com/blog/135599#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 26 Oct 2007 00:39:19 +0800</pubDate>
        <link>http://laowood.javaeye.com/blog/135599</link>
        <guid>http://laowood.javaeye.com/blog/135599</guid>
      </item>
      <item>
        <title>ldap</title>
        <author>laowood</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://laowood.javaeye.com">laowood</a>&nbsp;
          链接：<a href="http://laowood.javaeye.com/blog/135595" style="color:red;">http://laowood.javaeye.com/blog/135595</a>&nbsp;
          发表时间: 2007年10月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          LDAP的英文全称是Lightweight Directory Access Protocol，一般都简称为LDAP。它是基于<a href="http://baike.baidu.com/view/487586.htm" target="_blank">X.500</a>标准的，但是简单多了并且可以根据需要定制。与X.500不同，LDAP支持<a href="http://baike.baidu.com/view/7729.htm" target="_blank">TCP/IP</a>，这对访问Internet是必须的。LDAP的核心规范在RFC中都有定义，所有与LDAP相关的RFC都可以在LDAPman RFC网页中找到。现在LDAP技术不仅发展得很快而且也是激动人心的。在企业范围内实现LDAP可以让运行在几乎所有计算机平台上的所有的应用程序从 LDAP目录中获取信息。LDAP目录中可以存储各种类型的数据：电子邮件地址、邮件路由信息、人力资源数据、公用密匙、联系人列表，等等。通过把 LDAP目录作为系统集成中的一个重要环节，可以简化员工在企业内部查询信息的步骤，甚至连主要的数据源都可以放在任何地方。<br />
<br />
LDAP目录的优势<br />
<br />
如果需要开发一种提供公共信息查询的系统一般的设计方法可能是采用基于WEB的数据库设计方式，即前端使用浏览器而后端使用WEB服务器加上关系数据库。后端在Windows的典型实现可能是Windows NT + IIS + Acess数据库或者是SQL服务器，IIS和数据库之间通过ASP技术使用ODBC进行连接，达到通过填写表单查询数据的功能；<br />
<br />
后端在Linux系统的典型实现可能是Linux+ Apache + postgresql，Apache 和数据库之间通过PHP3提供的函数进行连接。使用上述方法的缺点是后端关系数据库的引入导致系统整体的性能降低和系统的管理比较繁琐，因为需要不断的进行数据类型的验证和事务的完整性的确认；并且前端用户对数据的控制不够灵活，用户权限的设置一般只能是设置在表一级而不是设置在记录一级。<br />
<br />
目录服务的推出主要是解决上述数据库中存在的问题。目录与关系数据库相似，是指具有描述性的基于属性的记录集合，但它的数据类型主要是字符型，为了检索的需要添加了BIN （二进制数据）、CIS（忽略大小写）、CES（大小写敏感）、TEL（电话型）等语法（Syntax），而不是关系数据库提供的整数、浮点数、日期、货币等类型，同样也不提供象关系数据库中普遍包含的大量的函数，它主要面向数据的查询服务（查询和修改操作比一般是大于10:1），不提供事务的回滚（rollback）机制，它的数据修改使用简单的锁定机制实现All-or-Nothing，它的目标是快速响应和大容量查询并且提供多目录服务器的信息复制功能。<br />
<br />
现在该说说LDAP目录到底有些什么优势了。现在LDAP的流行是很多因数共同作用的结果。可能LDAP最大的优势是：可以在任何计算机平台上，用很容易获得的而且数目不断增加的LDAP的客户端程序访问LDAP目录。而且也很容易定制应用程序为它加上LDAP的支持。<br />
<br />
LDAP协议是跨平台的和标准的协议，因此应用程序就不用为LDAP目录放在什么样的服务器上操心了。实际上，LDAP得到了业界的广泛认可，因为它是Internet的标准。产商都很愿意在产品中加入对LDAP的支持，因为他们根本不用考虑另一端（客户端或服务端）是怎么样的。LDAP服务器可以是任何一个开发源代码或商用的LDAP目录服务器（或者还可能是具有LDAP界面的关系型数据库），因为可以用同样的协议、客户端连接软件包和查询命令与LDAP服务器进行交互。与LDAP不同的是，如果软件产商想在软件产品中集成对DBMS的支持，那么通常都要对每一个数据库服务器单独定制。不象很多商用的关系型数据库，你不必为LDAP的每一个客户端连接或许可协议付费 大多数的LDAP服务器安装起来很简单，也容易维护和优化。<br />
<br />
LDAP服务器可以用&ldquo;推&rdquo;或&ldquo;拉&rdquo;的方法复制部分或全部数据，例如：可以把数据&ldquo;推&rdquo;到远程的办公室，以增加数据的安全性。复制技术是内置在LDAP服务器中的而且很容易配置。如果要在DBMS中使用相同的复制功能，数据库产商就会要你支付额外的费用，而且也很难管理。<br />
<br />
LDAP允许你根据需要使用ACI（一般都称为ACL或者访问控制列表）控制对数据读和写的权限。例如，设备管理员可以有权改变员工的工作地点和办公室号码，但是不允许改变记录中其它的域。ACI可以根据谁访问数据、访问什么数据、数据存在什么地方以及其它对数据进行访问控制。因为这些都是由LDAP目录服务器完成的，所以不用担心在客户端的应用程序上是否要进行安全检查。<br />
<br />
LDAP（Lightweight Directory Acess Protocol）是目录服务在TCP/IP上的实现（RFC 1777 V2版和RFC 2251<br />
<br />
V3版）。它是对X500的目录协议的移植，但是简化了实现方法，所以称为轻量级的目录服务。在LDAP中目录是按照树型结构组织，目录由条目（Entry）组成，条目相当于关系数据库中表的记录；条目是具有区别名DN（Distinguished<br />
<br />
Name）的属性（Attribute）集合，DN相当于关系数据库表中的关键字（Primary<br />
<br />
Key）；属性由类型（Type）和多个值（Values）组成，相当于关系数据库中的域（Field）由域名和数据类型组成，只是为了方便检索的需要，LDAP中的Type可以有多个Value，而不是关系数据库中为降低数据的冗余性要求实现的各个域必须是不相关的。LDAP中条目的组织一般按照地理位置和组织关系进行组织，非常的直观。LDAP把数据存放在文件中，为提高效率可以使用基于索引的文件数据库，而不是关系数据库。LDAP协议集还规定了DN的命名方法、存取控制方法、搜索格式、复制方法、URL格式、开发接口等<br />
<br />
LDAP对于这样存储这样的信息最为有用，也就是数据需要从不同的地点读取，但是不需要经常更新。<br />
<br />
例如，这些信息存储在LDAP目录中是十分有效的：<br />
<br />
l 公司员工的电话号码簿和组织结构图<br />
<br />
l 客户的联系信息<br />
<br />
l 计算机管理需要的信息，包括NIS映射、email假名，等等<br />
<br />
l 软件包的配置信息<br />
<br />
l 公用证书和安全密匙<br />
<br />
什么时候该用LDAP存储数据<br />
<br />
大多数的LDAP服务器都为读密集型的操作进行专门的优化。因此，当从LDAP服务器中读取数据的时候会比从专门为OLTP优化的关系型数据库中读取数据快一个数量级。也是因为专门为读的性能进行优化，大多数的LDAP目录服务器并不适合存储需要经常改变的数据。例如，用LDAP服务器来存储电话号码是一个很好的选择，但是它不能作为电子商务站点的数据库服务器。<br />
<br />
如果下面每一个问题的答案都是&ldquo;是&rdquo;，那么把数据存在LDAP中就是一个好主意。<br />
<br />
l 需要在任何平台上都能读取数据吗？<br />
<br />
l 每一个单独的记录项是不是每一天都只有很少的改变？<br />
<br />
l 可以把数据存在平面数据库（flat database）而不是关系型数据库中吗？换句话来说，也就是不管什么范式不范式的，把所有东西都存在一个记录中（差不多只要满足第一范式）。<br />
<br />
最后一个问题可能会唬住一些人，其实用平面数据库去存储一些关系型的数据也是很一般的。例如，一条公司员工的记录就可以包含经理的登录名。用LDAP来存储这类信息是很方便的。一个简单的判断方法：如果可以把保数据存在一张张的卡片里，就可以很容易地把它存在LDAP目录里。<br />
<br />
安全和访问控制<br />
<br />
LDAP提供很复杂的不同层次的访问控制或者ACI。因这些访问可以在服务器端控制，这比用客户端的软件保证数据的安全可安全多了。<br />
<br />
用LDAP的ACI，可以完成：<br />
<br />
l 给予用户改变他们自己的电话号码和家庭地址的权限，但是限制他们对其它数据（如，职务名称，经理的登录名，等等）只有&ldquo;只读&rdquo;权限。<br />
<br />
l 给予&ldquo;HR-admins&quot;组中的所有人权限以改变下面这些用户的信息：经理、工作名称、员工号、部门名称和部门号。但是对其它域没有写权限。<br />
<br />
l 禁止任何人查询LDAP服务器上的用户口令，但是可以允许用户改变他或她自己的口令。<br />
<br />
l 给予经理访问他们上级的家庭电话的只读权限，但是禁止其他人有这个权限。<br />
<br />
l 给予&ldquo;host-admins&quot;组中的任何人创建、删除和编辑所有保存在LDAP服务器中的与计算机主机有关的信息<br />
<br />
l 通过Web，允许&ldquo;foobar-sales&quot;组中的成员有选择地给予或禁止他们自己读取一部分客户联系数据的读权限。这将允许他们把客户联系信息下载到本地的笔记本电脑或个人数字助理（PDA）上。（如果销售人员的软件都支持LDAP，这将非常有用）<br />
<br />
l 通过Web，允许组的所有者删除或添加他们拥有的组的成员。例如：可以允许销售经理给予或禁止销售人员改变Web页的权限。也可以允许邮件假名（mail aliase）的所有者不经过IT技术人员就直接从邮件假名中删除或添加用户。&ldquo;公用&rdquo;的邮件列表应该允许用户从邮件假名中添加或删除自己（但是只能是自己）。也可以对IP地址或主机名加以限制。例如，某些域只允许用户IP地址以192.168.200.*开头的有读的权限，或者用户反向查找DNS得到的主机名必须为*.foobar.com。<br />
<br />
LDAP目录树的结构<br />
<br />
LDAP目录以树状的层次结构来存储数据。如果你对自顶向下的DNS树或UNIX文件的目录树比较熟悉，也就很容易掌握LDAP目录树这个概念了。就象DNS的主机名那样，LDAP目录记录的标识名（Distinguished Name，简称DN）是用来读取单个记录，以及回溯到树的顶部。后面会做详细地介绍。<br />
<br />
为什么要用层次结构来组织数据呢？原因是多方面的。下面是可能遇到的一些情况：<br />
<br />
l 如果你想把所有的美国客户的联系信息都&ldquo;推&rdquo;到位于到西雅图办公室（负责营销）的LDAP服务器上，但是你不想把公司的资产管理信息&ldquo;推&rdquo;到那里。<br />
<br />
l 你可能想根据目录树的结构给予不同的员工组不同的权限。在下面的例子里，资产管理组对&ldquo;asset-mgmt&quot;部分有完全的访问权限，但是不能访问其它地方。<br />
<br />
l 把LDAP存储和复制功能结合起来，可以定制目录树的结构以降低对WAN带宽的要求。位于西雅图的营销办公室需要每分钟更新的美国销售状况的信息，但是欧洲的销售情况就只要每小时更新一次就行了。<br />
<br />
刨根问底：基准DN<br />
<br />
LDAP目录树的最顶部就是根，也就是所谓的&ldquo;基准DN&quot;。基准DN通常使用下面列出的三种格式之一。假定我在名为FooBar的电子商务公司工作，这家公司在Internet上的名字是foobar.com。<br />
<br />
o=&quot;FooBar, Inc.&quot;, c=US<br />
<br />
（以X.500格式表示的基准DN）<br />
<br />
在这个例子中，o=FooBar, Inc. 表示组织名，在这里就是公司名的同义词。c=US 表示公司的总部在美国。以前，一般都用这种方式来表示基准DN。但是事物总是在不断变化的，现在所有的公司都已经（或计划）上Internet上。随着 Internet的全球化，在基准DN中使用国家代码很容易让人产生混淆。现在，X.500格式发展成下面列出的两种格式。<br />
<br />
o=foobar.com<br />
<br />
（用公司的Internet地址表示的基准DN）<br />
<br />
这种格式很直观，用公司的域名作为基准DN。这也是现在最常用的格式。<br />
<br />
dc=foobar, dc=com<br />
<br />
（用DNS域名的不同部分组成的基准DN）<br />
<br />
就象上面那一种格式，这种格式也是以DNS域名为基础的，但是上面那种格式不改变域名（也就更易读），而这种格式把域名： foobar.com分成两部分 dc=foobar, dc=com。在理论上，这种格式可能会更灵活一点，但是对于最终用户来说也更难记忆一点。考虑一下foobar.com这个例子。当 foobar.com和gizmo.com合并之后，可以简单的把&ldquo;dc=com&quot;当作基准DN。把新的记录放到已经存在的dc=gizmo, dc=com目录下，这样就简化了很多工作（当然，如果foobar.com和wocket.edu合并，这个方法就不能用了）。如果LDAP服务器是新安装的，我建议你使用这种格式。再请注意一下，如果你打算使用活动目录（Actrive Directory），Microsoft已经限制你必须使用这种格式。<br />
<br />
更上一层楼：在目录树中怎么组织数据<br />
<br />
在UNIX文件系统中，最顶层是根目录（root）。在根目录的下面有很多的文件和目录。象上面介绍的那样，LDAP目录也是用同样的方法组织起来的。<br />
<br />
在根目录下，要把数据从逻辑上区分开。因为历史上（X.500）的原因，大多数LDAP目录用OU从逻辑上把数据分开来。OU表示 &ldquo;Organization Unit&quot;，在X.500协议中是用来表示公司内部的机构：销售部、财务部，等等。现在LDAP还保留ou=这样的命名规则，但是扩展了分类的范围，可以分类为：ou=people, ou=groups, ou=devices，等等。更低一级的OU有时用来做更细的归类。例如：LDAP目录树（不包括单独的记录）可能会是这样的：<br />
<br />
dc=foobar, dc=com<br />
<br />
ou=customers<br />
<br />
ou=asia<br />
<br />
ou=europe<br />
<br />
ou=usa<br />
<br />
ou=employees<br />
<br />
ou=rooms<br />
<br />
ou=groups<br />
<br />
ou=assets-mgmt<br />
<br />
ou=nisgroups<br />
<br />
ou=recipes<br />
<br />
单独的LDAP记录<br />
<br />
DN是LDAP记录项的名字<br />
<br />
在LDAP目录中的所有记录项都有一个唯一的&ldquo;Distinguished Name&quot;，也就是DN。每一个LDAP记录项的DN是由两个部分组成的：相对DN（RDN）和记录在LDAP目录中的位置。<br />
<br />
RDN是DN中与目录树的结构无关的部分。在LDAP目录中存储的记录项都要有一个名字，这个名字通常存在cn（Common Name）这个属性里。因为几乎所有的东西都有一个名字，在LDAP中存储的对象都用它们的cn值作为RDN的基础。如果我把最喜欢的吃燕麦粥食谱存为一个记录，我就会用cn=Oatmeal Deluxe作为记录项的RDN。<br />
<br />
l 我的LDAP目录的基准DN是dc=foobar,dc=com<br />
<br />
l 我把自己的食谱作为LDAP的记录项存在ou=recipes<br />
<br />
l 我的LDAP记录项的RDN设为cn=Oatmeal Deluxe<br />
<br />
上面这些构成了燕麦粥食谱的LDAP记录的完整DN。记住，DN的读法和DNS主机名类似。下面就是完整的DN：<br />
<br />
cn=Oatmeal Deluxe,ou=recipes,dc=foobar,dc=com<br />
<br />
举一个实际的例子来说明DN<br />
<br />
现在为公司的员工设置一个DN。可以用基于cn或uid（User ID），作为典型的用户帐号。例如，FooBar的员工Fran Smith（登录名：fsmith）的DN可以为下面两种格式：<br />
<br />
uid=fsmith,ou=employees,dc=foobar,dc=com<br />
<br />
（基于登录名）<br />
<br />
LDAP（以及X.500）用uid表示&ldquo;User ID&quot;，不要把它和UNIX的uid号混淆了。大多数公司都会给每一个员工唯一的登录名，因此用这个办法可以很好地保存员工的信息。你不用担心以后还会有一个叫Fran Smith的加入公司，如果Fran改变了她的名字（结婚？离婚？或宗教原因？），也用不着改变LDAP记录项的DN。<br />
<br />
cn=Fran Smith,ou=employees,dc=foobar,dc=com<br />
<br />
（基于姓名）<br />
<br />
可以看到这种格式使用了Common Name（CN）。可以把Common Name当成一个人的全名。这种格式有一个很明显的缺点就是：如果名字改变了，LDAP的记录就要从一个DN转移到另一个DN。但是，我们应该尽可能地避免改变一个记录项的DN。<br />
<br />
定制目录的对象类型<br />
<br />
你可以用LDAP存储各种类型的数据对象，只要这些对象可以用属性来表示，下面这些是可以在LDAP中存储的一些信息：<br />
<br />
l 员工信息：员工的姓名、登录名、口令、员工号、他的经理的登录名，邮件服务器，等等。<br />
<br />
l 物品跟踪信息：计算机名、IP地址、标签、型号、所在位置，等等。<br />
<br />
l 客户联系列表：客户的公司名、主要联系人的电话、传真和电子邮件，等等。<br />
<br />
l 会议厅信息：会议厅的名字、位置、可以坐多少人、电话号码、是否有投影机。<br />
<br />
l 食谱信息：菜的名字、配料、烹调方法以及准备方法。<br />
<br />
因为LDAP目录可以定制成存储任何文本或二进制数据，到底存什么要由你自己决定。LDAP目录用对象类型（object classes）的概念来定义运行哪一类的对象使用什么属性。在几乎所有的LDAP服务器中，你都要根据自己的需要扩展基本的LDAP目录的功能，创建新的对象类型或者扩展现存的对象类型。<br />
<br />
LDAP目录以一系列&ldquo;属性对&rdquo;的形式来存储记录项，每一个记录项包括属性类型和属性值（这与关系型数据库用行和列来存取数据有根本的不同）。下面是我存在LDAP目录中的一部分食谱记录：<br />
<br />
dn: cn=Oatmeal Deluxe, ou=recipes, dc=foobar, dc=com<br />
<br />
cn: Instant Oatmeal Deluxe<br />
<br />
recipeCuisine: breakfast<br />
<br />
recipeIngredient: 1 packet instant oatmeal<br />
<br />
recipeIngredient: 1 cup water<br />
<br />
recipeIngredient: 1 pinch salt<br />
<br />
recipeIngredient: 1 tsp brown sugar<br />
<br />
recipeIngredient: 1/4 apple, any type<br />
<br />
请注意上面每一种配料都作为属性recipeIngredient值。LDAP目录被设计成象上面那样为一个属性保存多个值的，而不是在每一个属性的后面用逗号把一系列值分开。<br />
<br />
因为用这样的方式存储数据，所以数据库就有很大的灵活性，不必为加入一些新的数据就重新创建表和索引。更重要的是，LDAP目录不必花费内存或硬盘空间处理&ldquo;空&rdquo;域，也就是说，实际上不使用可选择的域也不会花费你任何资源。<br />
<br />
作为例子的一个单独的数据项<br />
<br />
让我们看看下面这个例子。我们用Foobar, Inc.的员工Fran Smith的LDAP记录。这个记录项的格式是LDIF，用来导入和导出LDAP目录的记录项。<br />
<br />
dn: uid=fsmith, ou=employees, dc=foobar, dc=com<br />
<br />
objectclass: person<br />
<br />
objectclass: organizationalPerson<br />
<br />
objectclass: inetOrgPerson<br />
<br />
objectclass: foobarPerson<br />
<br />
uid: fsmith<br />
<br />
givenname: Fran<br />
<br />
sn: Smith<br />
<br />
cn: Fran Smith<br />
<br />
cn: Frances Smith<br />
<br />
telephonenumber: 510-555-1234<br />
<br />
roomnumber: 122G<br />
<br />
o: Foobar, Inc.<br />
<br />
mailRoutingAddress: <a href="mailto:fsmith@foobar.com">fsmith@foobar.com</a>mailhost: mail.foobar.com<br />
<br />
userpassword: 3x1231v76T89N<br />
<br />
uidnumber: 1234<br />
<br />
gidnumber: 1200<br />
<br />
homedirectory: /home/fsmith<br />
<br />
loginshell: /usr/local/bin/bash<br />
<br />
属性的值在保存的时候是保留大小写的，但是在默认情况下搜索的时候是不区分大小写的。某些特殊的属性（例如，password）在搜索的时候需要区分大小写。<br />
<br />
让我们一点一点地分析上面的记录项。<br />
<br />
dn: uid=fsmith, ou=employees, dc=foobar, dc=com<br />
<br />
这是Fran的LDAP记录项的完整DN，包括在目录树中的完整路径。LDAP（和X.500）使用uid（User ID），不要把它和UNIX的uid号混淆了。<br />
<br />
objectclass: person<br />
<br />
objectclass: organizationalPerson<br />
<br />
objectclass: inetOrgPerson<br />
<br />
objectclass: foobarPerson<br />
<br />
可以为任何一个对象根据需要分配多个对象类型。person对象类型要求cn（common name）和sn（surname）这两个域不能为空。persion对象类型允许有其它的可选域，包括givenname、 telephonenumber，等等。organizational Person给person加入更多的可选域，inetOrgPerson又加入更多的可选域（包括电子邮件信息）。最后，foobarPerson是为 Foobar定制的对象类型，加入了很多定制的属性。<br />
<br />
uid: fsmith<br />
<br />
givenname: Fran<br />
<br />
sn: Smith<br />
<br />
cn: Fran Smith<br />
<br />
cn: Frances Smith<br />
<br />
telephonenumber: 510-555-1234<br />
<br />
roomnumber: 122G<br />
<br />
o: Foobar, Inc.<br />
<br />
以前说过了，uid表示User ID。当看到uid的时候，就在脑袋里想一想&ldquo;login&quot;。<br />
<br />
请注意CN有多个值。就象上面介绍的，LDAP允许某些属性有多个值。为什么允许有多个值呢？假定你在用公司的LDAP服务器查找Fran 的电话号码。你可能只知道她的名字叫Fran，但是对人力资源处的人来说她的正式名字叫做Frances。因为保存了她的两个名字，所以用任何一个名字检索都可以找到Fran的电话号码、电子邮件和办公房间号，等等。<br />
<br />
mailRoutingAddress: <a href="mailto:fsmith@foobar.com">fsmith@foobar.com</a>mailhost: mail.foobar.com<br />
<br />
就象现在大多数的公司都上网了，Foobar用Sendmail发送邮件和处理外部邮件路由信息。Foobar把所有用户的邮件信息都存在LDAP中。最新版本的Sendmail支持这项功能。<br />
<br />
Userpassword: 3x1231v76T89N<br />
<br />
uidnumber: 1234<br />
<br />
gidnumber: 1200<br />
<br />
gecos: Frances Smith<br />
<br />
homedirectory: /home/fsmith<br />
<br />
loginshell: /usr/local/bin/bash<br />
<br />
注意，Foobar的系统管理员把所有用户的口令映射信息也都存在LDAP中。FoobarPerson类型的对象具有这种能力。再注意一下，用户口令是用UNIX的口令加密格式存储的。UNIX的uid在这里为uidnumber。提醒你一下，关于如何在LDAP中保存NIS信息，有完整的一份RFC。在以后的文章中我会谈一谈NIS的集成。<br />
<br />
LDAP复制<br />
<br />
LDAP服务器可以使用基于&ldquo;推&rdquo;或者&ldquo;拉&rdquo;的技术，用简单或基于安全证书的安全验证，复制一部分或者所有的数据。<br />
<br />
例如，Foobar有一个&ldquo;公用的&rdquo;LDAP服务器，地址为ldap.foobar.com，端口为389。Netscape Communicator的电子邮件查询功能、UNIX的&ldquo;ph&quot;命令要用到这个服务器，用户也可以在任何地方查询这个服务器上的员工和客户联系信息。公司的主LDAP服务器运行在相同的计算机上，不过端口号是1389。<br />
<br />
你可能即不想让员工查询资产管理或食谱的信息，又不想让信息技术人员看到整个公司的LDAP目录。为了解决这个问题，Foobar有选择地把子目录树从主LDAP服务器复制到&ldquo;公用&rdquo;LDAP服务器上，不复制需要隐藏的信息。为了保持数据始终是最新的，主目录服务器被设置成即时&ldquo;推&rdquo;同步。这些种方法主要是为了方便，而不是安全，因为如果有权限的用户想查询所有的数据，可以用另一个LDAP端口。<br />
<br />
假定Foobar通过从奥克兰到欧洲的低带宽数据的连接用LDAP管理客户联系信息。可以建立从ldap.foobar.com:1389到munich-ldap.foobar.com:389的数据复制，象下面这样：<br />
<br />
periodic pull: ou=asia,ou=customers,o=sendmail.com<br />
<br />
periodic pull: ou=us,ou=customers,o=sendmail.com<br />
<br />
immediate push: ou=europe,ou=customers,o=sendmail.com<br />
<br />
&ldquo;拉&rdquo;连接每15分钟同步一次，在上面假定的情况下足够了。&ldquo;推&rdquo;连接保证任何欧洲的联系信息发生了变化就立即被&ldquo;推&rdquo;到Munich。<br />
<br />
用上面的复制模式，用户为了访问数据需要连接到哪一台服务器呢？在Munich的用户可以简单地连接到本地服务器。如果他们改变了数据，本地的LDAP服务器就会把这些变化传到主LDAP服务器。然后，主LDAP服务器把这些变化&ldquo;推&rdquo;回本地的&ldquo;公用&rdquo;LDAP服务器保持数据的同步。这对本地的用户有很大的好处，因为所有的查询（大多数是读）都在本地的服务器上进行，速度非常快。当需要改变信息的时候，最终用户不需要重新配置客户端的软件，因为LDAP目录服务器为他们完成了所有的数据交换工作。 <br />
          <br/>
          <span style="color:red;">
            <a href="http://laowood.javaeye.com/blog/135595#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 26 Oct 2007 00:24:17 +0800</pubDate>
        <link>http://laowood.javaeye.com/blog/135595</link>
        <guid>http://laowood.javaeye.com/blog/135595</guid>
      </item>
      <item>
        <title>Struts+spring+hibernate中 最重要配置的地方</title>
        <author>laowood</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://laowood.javaeye.com">laowood</a>&nbsp;
          链接：<a href="http://laowood.javaeye.com/blog/131842" style="color:red;">http://laowood.javaeye.com/blog/131842</a>&nbsp;
          发表时间: 2007年10月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>在<font color="#ff0000">struts-config.xml</font>里面</p>
<p>&nbsp;</p>
<p>写一个</p>
<p>&lt;plug-in className=&quot;org.springframework.web.struts.ContextLoaderPlugIn&quot;&gt;</p>
<p>　　&lt;set-property property=&quot;ContextConfigLocation&quot; value=&quot;/WEB-INF/applicationContext.xml&quot;&gt;</p>
<p>&lt;/plug-in&gt;</p>
<p>&nbsp;</p>
<p>&lt;action-mappings&gt;里面的 &lt;action&gt;的type=&quot;org.springframework.web.struts.DelegatingActionPorxy&quot;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>在applicationContext.xml中 把DAO注入到action中</p>
<p>&lt;bean name=&quot;/user&quot; class=&quot;com.you.XAction&quot;&gt;</p>
<p>　　&lt;property name=&quot;dao&quot; ref=&quot;DAO&quot;&gt;&lt;/property&gt;</p>
<p>&lt;/bean&gt;</p>
          <br/>
          <span style="color:red;">
            <a href="http://laowood.javaeye.com/blog/131842#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 14 Oct 2007 23:03:06 +0800</pubDate>
        <link>http://laowood.javaeye.com/blog/131842</link>
        <guid>http://laowood.javaeye.com/blog/131842</guid>
      </item>
      <item>
        <title>hibernate一对一配置</title>
        <author>laowood</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://laowood.javaeye.com">laowood</a>&nbsp;
          链接：<a href="http://laowood.javaeye.com/blog/131840" style="color:red;">http://laowood.javaeye.com/blog/131840</a>&nbsp;
          发表时间: 2007年10月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&lt;one-to-one name=&quot;user&quot; class=&quot;xx&quot;&gt;&lt;/one-to-one&gt; </p>
<div class="content">
<p>在 user.hbm.xml中 &lt;one-to-one name=&quot;card&quot; class=&quot;yy&quot; cascade=&quot;all&quot;&gt;&lt;/one-to-one&gt; </p>
<p>user就是主控</p>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://laowood.javaeye.com/blog/131840#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 14 Oct 2007 23:00:59 +0800</pubDate>
        <link>http://laowood.javaeye.com/blog/131840</link>
        <guid>http://laowood.javaeye.com/blog/131840</guid>
      </item>
      <item>
        <title>最基本的HQL语句</title>
        <author>laowood</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://laowood.javaeye.com">laowood</a>&nbsp;
          链接：<a href="http://laowood.javaeye.com/blog/131839" style="color:red;">http://laowood.javaeye.com/blog/131839</a>&nbsp;
          发表时间: 2007年10月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>public void queryByID(String id){</p>
<p>&nbsp;</p>
<p>String hql=&quot;form Person where id=?&quot;;</p>
<p>Query q=this.session.createQuery(hql);</p>
<p>q.setString(0,id);</p>
<p>List list=q.list();</p>
<p>Iterator iter=list.iterator();</p>
<p>if(iter.hasNext()){</p>
<p>　　p=(Person)iter.next();</p>
<p>&nbsp;</p>
<p>}</p>
<p>return p;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>public void delete(Person p){</p>
<p>&nbsp;</p>
<p>　　this.session.delete(p);</p>
<p>}</p>
<p>&nbsp;</p>
<p>public void delete(String id){</p>
<p>　　String hql=&quot;delect Person where id=?&quot;;</p>
<p>　　Query q=this.session.createQuery(hql);</p>
<p>　　q.setString(0,id);</p>
<p>　　q.executeUpdate();</p>
<p>　　this.session.beginTransaction().commit();</p>
<p>&nbsp;</p>
<p>}</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>public List queryAll(){</p>
<p>　　String hql=&quot;from Person p&quot;;</p>
<p>　　Query q=this.session.createQuery(hql);</p>
<p>　　List list=q.list();</p>
<p>　　return list;</p>
<p>}</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>public list queryByLike(String cond){</p>
<p>　　list l;</p>
<p>　　Query q=this.session.createQuery(&quot;from person where name like ?&quot;);</p>
<p>　　q.setString(0,&quot;%+cond+%&quot;);</p>
<p>　　l=q.list();</p>
<p>　　</p>
<p>　　return l;</p>
<p>}</p>
          <br/>
          <span style="color:red;">
            <a href="http://laowood.javaeye.com/blog/131839#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 14 Oct 2007 22:59:26 +0800</pubDate>
        <link>http://laowood.javaeye.com/blog/131839</link>
        <guid>http://laowood.javaeye.com/blog/131839</guid>
      </item>
      <item>
        <title>利用快捷方式方式解决  在中文eclipse下启动英文eclips,建立工作空间,拋异常处理办法</title>
        <author>laowood</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://laowood.javaeye.com">laowood</a>&nbsp;
          链接：<a href="http://laowood.javaeye.com/blog/131837" style="color:red;">http://laowood.javaeye.com/blog/131837</a>&nbsp;
          发表时间: 2007年10月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>建立一个快捷方式 </p>
<p>比如</p>
<p>D:\eclipse\eclipse.exe -nl en</p>
<p>&nbsp;</p>
<p>这就可以变成 英文的eclipse</p>
<p>&nbsp;</p>
<p>建立工作空间是</p>
<p>D:\eclipse\eclipse.exe -data f:\workspace</p>
<p>这就是在f盘下建立一个工作空间</p>
<p>&nbsp;</p>
<p>解决eclipse 一直弹出异常的解决办法</p>
<p>D:\eclipse\eclipse.exe -clean</p>
<p>一切干净了</p>
          <br/>
          <span style="color:red;">
            <a href="http://laowood.javaeye.com/blog/131837#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 14 Oct 2007 22:55:20 +0800</pubDate>
        <link>http://laowood.javaeye.com/blog/131837</link>
        <guid>http://laowood.javaeye.com/blog/131837</guid>
      </item>
      <item>
        <title>开发基于Domino/Notes的动态Web网站 </title>
        <author>laowood</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://laowood.javaeye.com">laowood</a>&nbsp;
          链接：<a href="http://laowood.javaeye.com/blog/217370" style="color:red;">http://laowood.javaeye.com/blog/217370</a>&nbsp;
          发表时间: 2007年09月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>开发基于Domino/Notes的动态Web网站<br />　　用户的需求 </p>
<p>　　笔者最近开发某公司MIS系统时，用户提出了以下的一些需求：利用用户的局域网实现对数据库及文档信息的访问。数据由用户的一套基于VFP的业务系统提供，希望实现通过局域网供各部门及领导及时查询，同时实现文档信息的动态发布。 </p>
<p>　　方案的分析 </p>
<p>　　1.采用Browser/Web Server(B/S)模式 </p>
<p>　　随着Web技术的迅速发展，B/S模式已经被广泛地采用。与传统的Client/Server(C/S)相比，B/S模式有许多优点： </p>
<p>　　* 不需要开发Client端软件。在Client端只需要有标准的浏览器就可以；由于对数据库查询、浏览的功能都在Web Server端进行，因此系统管理和维护工作大大减少。 </p>
<p>　　* 用户操作实现了标准化。由于Client端是标准的浏览器，因此操作变得非常简单。 </p>
<p>　　2.通过ODBC访问后台VFP数据库 </p>
<p>　　由于用户需要动态地将信息发布到网上，而传统的静态的Web页面无法实现这些交互功能，因此我们必须将数据库与Web连接起来，并根据用户的需要，动态地产生用户需要的数据，以供用户查询、浏览。在数据库方面，为了与用户原有系统实现快速无缝连接，我们仍然选用VFP进行数据库管理。要实现动态页面，就必须实现对Server端的VFP数据库进行动态访问，因此，必须在Server端配置ODBC驱动程序。 </p>
<p>　　查询结果图表一 </p>
<p>　　3.对文档信息的访问，选用业界流行的Lotus Domino/Notes的解决方案 </p>
<p>　　由于MIS系统对复合文档数据的处理要求，必须以文档数据库为核心建立，同时选择性地结合关系数据库。Lotus Domino/Notes是电子邮件、文档数据库、快速应用开发技术以及Web技术为一体的电子邮件与群件平台。目前，国内许多政府机关和企事业单位都采用Lotus Domino/Notes作为MIS系统的基础平台。 </p>
<p>　　与其他Web服务器相比，Lotus Domino的优势在于： </p>
<p>　　数据库管理：用户可以用数据库形式管理Web站点页面及内容，而不仅仅是存储。Domino数据库自动维护信息之间的链接关系，使站点维护更简单。因此，在日常工作中，大量文档信息的Web发布工作完全可以交给业务人员完成，而无需由技术人员通过HTML编程的方式来进行文档信息的维护。 </p>
<p>　　安全性控制：任何对Web信息的访问都受到安全性的控制，确保合适的人访问合适的信息。 </p>
<p>　　查询结果图表二 </p>
<p>　　4.Web Server选用Windows NT的IIS。 </p>
<p>　　技术的实现 </p>
<p>　　方案确定以后，主要需解决三个问题：必须让IIS能够处理对Notes数据库的访问；在Notes表单中运行的代理程序必须能够访问ODBC数据库； 调整IIS和Domino之间的安全性冲突。下面详细介绍在系统安装配置过程中如何解决上面三个问题，限于篇幅，开发过程只作简单介绍。 </p>
<p>　　安装步骤： </p>
<p>　　步骤一：安装Windows NT Server 4.0和IIS4.0。 </p>
<p>　　步骤二：在NT上配置ODBC，设置数据源(DSN)。运行NT控制面板的&ldquo;ODBC数据源&rdquo;，在&ldquo;系统DSN&rdquo;窗口下单击&ldquo;添加&rdquo;按纽，选择&ldquo;Micosoft Visual Foxpro Driver&rdquo;,在&ldquo;Data Source Name&rdquo;中输入数据源名，如：oil，在&ldquo;Path&rdquo;中指定ODBC数据源的路径，如：d:oil_dataoil.dbc。 </p>
<p>　　步骤三：安装ChartFX。为了在客户浏览器端生成动态数据图，需要在Server端安装ChartFX ActivX控件。在NT上运行CfxIESrv.exe，选择默认安装方式，参数设置成默认值；再运行ChartFX的升级程序&mdash;&mdash;CfxIEUpdSrv(2).exe；修改NT目录下的CfxSrv.ini文件，改为以下设置： </p>
<p>　　Relative=/cfxtemp </p>
<p>　　Absolute=d:oilcfxtemp (假定oil目录在D分区) </p>
<p>　　步骤四：建立IIS管理的站点。建立D:oil目录，HTML页面文件均放在该目录下；运行IIS的Internet服务管理器，选定默认Web站点属性中的IP地址，确保其绑定在80端口上，并将主目录的本地路径设为d:oil目录；在默认Web站点属性里的&ldquo;主目录&rdquo;属性中，将&ldquo;FrongPage Web&rdquo;选项选中；将Scripts虚目录定为oilscripts目录，并将许可选项定为&ldquo;执行&rdquo;；在资源管理器中，分别选中oil下的cfxtemp和Scripts目录，单击右键选择属性，在安全性中，选择&ldquo;权限&rdquo;按钮，将&ldquo;Everyone&rdquo;的权限设为&ldquo;完全控制&rdquo;，并将&ldquo;替换子目录的权限&rdquo;选中，选择&ldquo;确定&rdquo;按钮。 </p>
<p>　　步骤五：安装Domino Server，配置Domino for IIS。将Domino设置成for IIS，这样对Notes库的访问全由IIS负责，Domino可以不用启动。 </p>
<p>　　在确认IIS和Domino正常工作后，需要设置Domino ISAPI扩展，以便当IIS收到浏览器发来的Domino应用程序请求时可以使用该程序；启动Internet服务管理器，右键点击默认Web站点，选择属性，在主目录选项页中，单击&ldquo;配置&rdquo;&rarr;&ldquo;添加&rdquo;，在可执行文件域中输入ISAPI扩展文件（niisextn.dll）的完整路径名；在扩展名域中，输入&ldquo;.NSF&rdquo;，在不包括的方法域中输入下列不被Domino for IIS支持的HTTP成员函数：PUT、DELETE；选中脚本引擎，取消选择检查文件是否存在选项。 </p>
<p>　　设置IIS扩展过滤器，以便将用户证书正确地传递给Domino；启动Internet服务管理器，右键点击默认Web站点，选择属性，选择ISAPI筛选器并单击添加；在筛选器名域中输入用来描述IIS过滤器的文字，如：Domino；在可执行文件域中输入过滤器文件（niisfilt.dll）的完整路径名。 </p>
<p>　　步骤六：调整IIS的安全性与Domino的冲突。在默认Web站点属性的&ldquo;目录安全性&rdquo;中，单击&ldquo;匿名访问和验证控件&rdquo;，再单击&ldquo;编辑&rdquo;，在&ldquo;验证方法&rdquo;中取消选择&ldquo;Windows NT挑战/反应&rdquo;选项。 </p>
<p>　　开发简介： </p>
<p>　　1. 用FrontPage、DreamWeaver等网页制作工具制作HTML页面文件，存放在d:oil目录下，并通过超级链接访问Notes数据库中相应的视图或表单； </p>
<p>　　2. 用于Web动态查询的VFP数据库存放在d:oil_data目录下，并进行相应的ODBC配置，如上所述； </p>
<p>　　3.Notes数据库存放在d:lotusdominodataoil_info目录下，用Lotus Domino Designer开发相应的表单和视图，对ODBC数据库的操作通过在表单中执行代理程序来进行，对文档数据库的操作可以通过视图和表单来完成。由于Notes数据库的安全机制非常完善，可以对文档数据库、表单甚至域级进行权限控制，因此，可以很方便地在Web上实现特定的用户访问特定的内容。 </p>
<p>　　开发实例 </p>
<p>　　笔者用以上的方法为某石油公司开发了一套信息发布及业务查询系统。文档的Web发布包括工作动态、发文公告、通讯录等。该系统完全实现了由业务人员从任一台联网的计算机上对文档信息进行管理，包括新增、删除、修改、查看、全文搜索等操作并及时发布；业务数据查询通过在Notes表单中的代理程序访问ODBC数据库（VFP数据库及表），本文的两张附图所显示的就是通过Web方式查询到的VFP数据库的信息。 </p>
<p>　　备注：此设计在基于HP NetServer硬件平台上开发并运行，顺利实现了设计目标，取得理想结果。&nbsp;<br />&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://laowood.javaeye.com/blog/217370#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 27 Sep 2007 08:08:00 +0800</pubDate>
        <link>http://laowood.javaeye.com/blog/217370</link>
        <guid>http://laowood.javaeye.com/blog/217370</guid>
      </item>
      <item>
        <title>池连代码</title>
        <author>laowood</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://laowood.javaeye.com">laowood</a>&nbsp;
          链接：<a href="http://laowood.javaeye.com/blog/114992" styl