存档

‘.NET’ 分类的存档

C#操作Excel,Word

2010年12月18日 admin 没有评论

首先添加对excel组件的引用 ->com->Microsoft Excel 11或12
如果本机Office 没有完全安装 还需要下载 office 2003 pia组件
1.C#写Excel文件

using Excel = Microsoft.Office.Interop.Excel;
public static void OperatExcel(DataTable dt,string FileName,string SavePath)
{
Excel.Application excel = new Excel.Application();
object objMissing = System.Reflection.Missing.Value;
//打开excel文件
// excel = new Excel.ApplicationClass();
 
excel.Visible = false;
 
//打开工作簿
 
Excel.Workbook mybook = excel.Workbooks.Open(FileName, objMissing, objMissing, objMissing,
objMissing, objMissing, objMissing,
objMissing, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing,
objMissing );
 
Excel.Worksheet mysheet = (Excel.Worksheet)mybook.Worksheets.get_Item(1);
 
//设置第10行为红色
 
//mysheet.get_Range((Excel.Range)mysheet.Cells[10, 2]).Select();
// mysheet.get_Range((Excel.Range)mysheet.Cells[10, 2],).Text = "sssss"; ;
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 5; j++)
{
mysheet.Cells[i + 3, j + 2] = dt.Rows[i+1][j+1].ToString();
}
}
 
excel.ActiveWorkbook.SaveAs(SavePath, Excel.XlFileFormat.xlExcel9795,
null, null, false, false, Excel.XlSaveAsAccessMode.xlNoChange,
null, null, null, null, null);
excel.Quit();
excel = null;
 
GC.Collect();//垃圾回收
 
}

这里“GC.Collect();//垃圾回收 ”不一定能把excel进程回收掉
C# 操作excel后关闭

using   System.Runtime.InteropServices;     
 
   [DllImport("User32.dll",   CharSet   =   CharSet.Auto)]     
   public   static   extern   int   GetWindowThreadProcessId(IntPtr   hwnd,   out   int   ID);     
   protected   void   Button1_Click(object   sender,   EventArgs   e)     
   {     
       Excel.ApplicationClass   excel   =   new   Microsoft.Office.Interop.Excel.ApplicationClass();     
       excel.Workbooks.Open("d:\aaa.xls",   Type.Missing,   Type.Missing,   Type.Missing,   Type.Missing,   Type.Missing,   Type.Missing,   Type.Missing,   Type.Missing,   Type.Missing,   Type.Missing,   Type.Missing,   Type.Missing,   Type.Missing,   Type.Missing);     
       IntPtr   t   =   new   IntPtr(excel.Hwnd);     
       int   k   =   0;     
       GetWindowThreadProcessId(t,   out   k);     
       System.Diagnostics.Process   p   =   System.Diagnostics.Process.GetProcessById(k);     
       p.Kill();                     
    }

2.C#读Excel文件

string strConnection = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source ={0};
Extended Properties = Excel 8.0", strFileName);
OleDbConnection oleConnection = new OleDbConnection(strConnection);
//try
//{
string strCommondText = "SELECT * FROM [Device$] ";
oleConnection.Open();
DataSet dsRead = new DataSet();
 
OleDbDataAdapter oleAdper =
new OleDbDataAdapter(strCommondText, oleConnection);
oleAdper.Fill(dsRead, "Pantent");
Maticsoft.Model.Device model = new Maticsoft.Model.Device();
Maticsoft.DAL.Device dal = new Maticsoft.DAL.Device();
Maticsoft.DAL.Users dalUser = new Maticsoft.DAL.Users();
DataTable dt = dsRead.Tables[0];
for (int i = 1; i < dt.Rows.Count; i++)
{
model.deviceId= dt.Rows[i][0].ToString();
dal.Add(model);
}
return dsRead;
//}
//catch (System.Exception)
//{
//    throw new ApplicationException("读取数据源文件时出错");
//}
//finally
//{
//    oleConnection.Close();
//}

3.    C# word操作.需要对word模板设置指定的书签位置

Word.Application _wordApp = new Word.Application();
object filename = OpenPath + fileName;
object isReadonly = false;
object isVisible = true;
object missing = System.Reflection.Missing.Value;
 
Word.Document odoc = _wordApp.Documents.Open(ref   filename, ref   missing,
ref   isReadonly, ref   missing, ref   missing, ref   missing,
ref   missing, ref   missing, ref   missing, ref   missing,
ref   missing, ref   isVisible, ref   missing, ref   missing,
ref   missing, ref missing);
 
odoc.Activate();
 
//在书签处输出文字
object oBookmark0 = "CourseName";
odoc.Bookmarks.get_Item(ref oBookmark0).Range.Text = courseName;
 
object oBookMark1 = "LabName";
odoc.Bookmarks.get_Item(ref oBookMark1).Range.Text = labName;
 
object oBookMark2 = "StuName";
odoc.Bookmarks.get_Item(ref oBookMark2).Range.Text = stuName;
 
object oBookMark3 = "StuId";
odoc.Bookmarks.get_Item(ref oBookMark3).Range.Text = stuId;
 
object oBookMark4 = "StuClassName";
odoc.Bookmarks.get_Item(ref oBookMark4).Range.Text = stuClassName;
 
 
//另存为
string newFileName = string.Format("{0}{1}{2}.doc", stuId, stuName, labName);
filename = SavePath + newFileName;
 
odoc.SaveAs(ref filename, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing);
 
odoc.Close(ref missing, ref missing, ref missing);
 
 
_wordApp.Quit(ref missing, ref missing, ref missing);
 
_wordApp = null;
 
GC.Collect();
 
GC.WaitForPendingFinalizers();
 
GC.Collect();
 
GC.WaitForPendingFinalizers();
分类: .NET 标签: ,

多线程,抓取页面

2010年11月9日 admin 没有评论

这几天在进行网站的扫黄工作,对网站,域名进行一个个的排查。当然如果真的一个个去打开看
一下,真的是会搞死人的。有几十万的网站要去排查,那天我们几十个人搞到通宵也没搞好。不过
通过一天的劳累,也总结了不少方法。
首先是梁Boss的批处理文件,it is a real good  idea to open a batch web pages.如果单一的
去打开一个个的网页,肯定是吃不消地。只需要稍稍应用下批处理文件就可以一下打开好几十个网页
。具体操作如下:1.新建txt文件,输入内容如下
start http://www.baidu.cn
start http://www.baidu2.cn
start http://www.baidu3.cn
start http://www.baidu4.cn
….

但是 如果打开过多浏览器就会崩溃,这时就需要增加 一个
pause ,每打开多少就暂停一下。
当然这样子操作 还是要我们去肉眼判断。能不能将工作再简化一下呢,毕竟是几十万的数据啊。
我的选择是抓取网页内容,先过滤一遍关键字,因为通过网页内容文字与关键字的匹配,不能说
百分百的正确,也能达到百分七八十的正确率,再对过滤出来的网页进行人工审核,工作量减轻一
大半。
所以,就有了以下这个程序“多线程-狂抓页面”。为什么选择多线程 而不是线程池?因为多线程
我可以将线程数组设到100或1000,线程池的容量有限,还有就是我也不知道如何将线程池开到成百
上千个线程去执行,而又不冲突,主要还是对线程池不是很掌握。话不多说,贴上代码,代码是在
小谢的代码基础上的改进,在此表示感谢。
程序效果图如下:

下面进行一步步分析,如何用 多线程-狂抓页面
声明一个域名队列,
Queue<string> domainqueue = new Queue<string>();
所有要查域名都放在队列里
foreach (string domain in domains)
{
//所有域名进队列
domainqueue.Enqueue(domain);
}

声明一个线程数组:并启动
threads = new Thread[threadNum];
for (int i = 0; i < threadNum; i++)
{
threads[i] = new Thread(new ThreadStart(RunThread));
threads[i].Name = “checkDomain”+i;
threads[i].IsBackground = true;
//启动
threads[i].Start();
}

线程执行代理函数 (RunThread)
//执行线程
public void RunThread()
{
Thread current_thread = Thread.CurrentThread;//当前线程
MyInvoke mi = new MyInvoke(rtb_result.AppendText); //代理,显示线程结果
MyInvoke mi2 = new MyInvoke(rtb_illegal.AppendText);//代理,显示过滤结果
//当队列存在
while (domainqueue.Count > 0)
{
//出队列
string domain = domainqueue.Dequeue();
try
{
//同步显示
rtb_result.Invoke(mi,”域名:["+domain+"]   当前线程:["+current_thread.Name+"]” + “\r\n”);
string keyword=”";
//若扫描到,过滤结果
if (ScanDomain(domain, out keyword)) //扫描函数
{
rtb_illegal.Invoke(mi2, domain + “:” + keyword + “\r\n”);
}
//带www主机头的扫描
string host = “www.”;
if (cbx_www.Checked)
{
if (ScanDomain(host + domain, out keyword))
{
rtb_illegal.Invoke(mi2,host+ domain + “:” + keyword + “\r\n”);
}
}
}
catch (Exception ex)
{
rtb_result.Invoke(mi,ex.ToString()+”\r\n”);
}
}

}

//扫描函数
//扫描域名是否含非法信息
private bool ScanDomain(string domain,out string keyword)
{
keyword = null;
//抓取页面内容并过滤 html标记
string pageContent = PageOp.NoHTML(PageOp.GetPageContent(domain));
//抓取页面的内容,进行非法关键字匹配
return PageOp.IsIllegal(pageContent,out keyword);
}
其中抓取页面我用的webrequest对象,但是webrequest对有些网页的抓取是抓不到的,但他又比xmlhttp抓取要快,
所以我说先用webrequest 抓取,抓不到的再用xmlhttp  去抓取。
测试的效果还不错,如果网站是有网页并且可访问,1000个开100个线程也就1分钟样子就搞定,难的是有些域名是
没有解析的抓不到。也会造成网络堵塞,qq都掉了2次,抓太多也不好的啊。呵呵

分类: .NET 标签: ,

ASP.NET 下的资源文件使用

2010年11月9日 admin 没有评论

资源文件通常用在Winform中比较多,其实ASP.NET也可以使用资源文件实现多语言化。
朋友托我帮他做个小站,2钟语言版本的,我想既然是小站那也得给它加点料。刚学了
点资源文件的皮毛,那就用上了哈。示例网站如下http://www.donglongcf.cn.
下面开始如何一步步建立多语言化网站。
第一步:
新建2个资源文件,其中命名为Resource.resx,Resource_En.resx代表英文。
在界面上Aspx文件上,直接
<%= Resources.Resource.String1 %>
控件中绑定 可以这样
<asp:Label ID=”lbl_global” runat=”server” Text=”<%# Resources.Resource.Button1 %>”></asp:Label>
也可以这样
<asp:TextBox ID=”TextBox1″ runat=”server”  Text=”<%$ Resources:Resource, String1 %>” ></asp:TextBox>
就可以将对应的资源文件的值读取出来
但是,通常我们不是这样使用资源文件。只有在语言切换的时候,才显示不同的语言。比如
点击中文,显示中文语言包,英文则显示英文语言包。所以 我们要对当前语言环境进行设置
第二步:
在页面初始化的时候,设定当前语言环境,中文值为zh-CN,英文则为en-US
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(“zh-CN”);

但是,我们依然不满足,我们没必要在每个页面的page_load里都加这么一句,太繁琐。
第三步,重写页面的InitializeCulture方法
新建一个InitialCulture
protected override void InitializeCulture()
{
//当前语言变量放在了Session里 也可以放Cookie
if (Session["lang"] != null)
{
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(Session["lang"].ToString());
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(Session["lang"].ToString());
// base.InitializeCulture();
}
else
{
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(“zh-CN”);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(“zh-CN”);
}
base.InitializeCulture();
}
然后每个页面重新继承:
public partial class _Default :InitialCulture

如果你是个懒惰的程序员,那么每个页面加这么一句肯定也不会满足你。这时 就嗅到了bad smell.
第四步,
建立httpMoudle
通过在httpModle实现全局的控制
//应用程序初始化
public void Init(HttpApplication app)
{
app.AcquireRequestState += new EventHandler(context_AcquireRequestState);
//这里委托在AcquireRequestState 进行操作是 因为我把全局语言变量 放在了session里
//而session 的生成是 在AcquireRequestState 才有效
}

void context_AcquireRequestState(object sender, EventArgs e)
{
HttpApplication app = sender as HttpApplication;
LangGuage(app);
}

private void LangGuage(HttpApplication app)
{

if (app.Context.Session["lang"] == null)
app.Context.Session["lang"] = “zh-CN”;
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(app.Context.Session["lang"].ToString());
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(app.Context.Session["lang"].ToString());
}
#endregion

这样我们的网站多语言话就初步完成了 剩下的就只是对资源文件的使用而已了

分类: .NET 标签:

winform混淆器(DotFuscator, .NET Reactor, xenocode)

2010年10月28日 admin 没有评论

在介绍工具之前,我需要说明几点:

1.使用代码混淆器存在一定的风险,在使用前最好做好相关代码备份

2.凡是需要序列化成二进制的代码,是不能用混淆器的。混淆后的代码将不能正常序列化!

DotFuscator是VS里面一个自带的代码混淆器,VS——工具——Dotfuscator Community Edition

具体使用方法,及产生的混淆效果,可参考:http://blog.csdn.net/netjxz/archive/2006/12/12/1439866.aspx

.NET Reactor,这个非常小巧,免安装,而且不需要注册。他只是将代码换成随机码,但是混淆后的代码都能正常使用。

具体的使用方法都比较简单,下载地址:http://files.cnblogs.com/ghost79/DotNETReactor.rar

xeoncode 则是一款相对更加专业的代码混淆软件,混淆后的程序集可以屏蔽一些反编译工具(Ildasm之类的),具体使用方法:

用法一:

1、导入要加密的dotNET程序或assembly文件(.dll/.exe)
2、选择第二个选项卡“Protect”
3、点击“Select Pattern”
4、选中所有“Object Type”和所有“Visiblility”
5、“Action”选择“Do not obfuscate”,Apply,把所有的内容都设为不进行混淆
6、“Action”选择“Obfuscate”,“Visibility”只选择“Private”,Apply
7、右下角按下“XenoCode Assemblies”,导出混淆后的文件

用法二:

1、选中Application标签
2、点击Add按钮,加载要混淆的Dll、Exe文件
3、如果是Dll文件则选中Preset列表框中的第二项,反之选中第一项
4、点击Apply按钮
5、选中Protect标签
6、选中Supress other reflection tools复选框
7、点击Select String按钮进行设置
8、点击XenoCode按钮完成混淆工作

9、再换一个文件进行混合到全部文件混淆完毕为止!

下载地址:http://d.download.csdn.net/down/1702658/Danny_Su

分类: .NET 标签:

筛选重复数据 C# 求同求异

2010年9月28日 admin 没有评论

经常处理大批量的数据,写个小程序简化操作筛选重复

List<string> list1 = new List<string>();
 List<string> list2 = new List<string>();
 List<string> listBoth = new List<string>(); 
if (!GetList(out list1, out list2))
 { return; } 
string diff = ""; 
if (list1.Count>=list2.Count)
 { 
foreach (string s in list1)
 { if (list2.Contains(s)) { listBoth.Add(s); } } } 
else { foreach (string s in list2) { if (list1.Contains(s)) { listBoth.Add(s); } } }
 foreach (string s in list1) { if(!listBoth.Contains(s)) { diff += s+"\r\n"; } }
 foreach (string s in list2) { if (!listBoth.Contains(s)) { diff += s + "\r\n"; } } 
b_result.Text = diff;
// 求相同
 List<string> list1=new List<string>(); List<string> list2=new List<string>(); 
if(!GetList(out list1,out list2)) { return; } string both = "";
 foreach (string s in list1) { if(list2.Contains(s))
 { both += s + "\r\n"; } } b_result.Text = both;
// GestList函数如下:
 private bool GetList(out List<string> list1,out List<string> list2)
 { string s1 = b_text1.Text; string s2 = b_text2.Text;
 string[] arr1; string[] arr2; 
list1 = new List<string>(); 
list2 = new List<string>();
 if (string.IsNullOrEmpty(s1) || string.IsNullOrEmpty(s2))
 { MessageBox.Show("不能为空"); return false; } 
arr1 = s1.Replace("\r\n", ",").Split(','); 
arr2 = s2.Replace("\r\n", ",").Split(','); 
foreach (string s in arr1) { list1.Add(s); } 
foreach (string s in arr2) { list2.Add(s); } return true; }
分类: .NET 标签: ,

字符串空比较

2010年9月28日 admin 没有评论

判断字符串变量str是否为空的一下三种方法哪个性能更优:
a、str== ” “;b、str==String.Empty;c、str.Length==0;?
据说答案是C,不太明白,请问为什么啊 str.Length==0 效率更快
1.使用Length来检查一个字符串是否为空。
计算Length时,只需要检查内部数组的长度,不需要字节比较。而字节比较是比直接计算计算要慢很多的

2.在来看看string的一个构造函数 String (Char[], Int32, Int32) 将 String 类的新实例初始化为由 Unicode 字符数组、该数组内的起始字符位置和一个长度指示的值。 即string对象在本身构造时,就已经有一个参数是长度指示,他对外的表现就是Length

3.我们在来看看String.Empty本质,有一定c++和vb基础的都知道,一个字符串都有一个表示结尾的字节,net环境下也是如此,这个结尾的字节就是String.Empty 4.使用str==String.Empty要比str== ” “快速因为String.Empty在内部是个常量 综上: a、str== ” “; b、str==String.Empty; c、str.Length==0; c优于b,b优于a

分类: .NET 标签: ,

C#基础:ref和out的区别

2010年9月22日 admin 没有评论

在C# 中,既可以通过值也可以通过引用传递参数。通过引用传递参数允许函数成员更改参数的值,并保持该更改。若要通过引用传递参数, 可使用ref或out关键字。ref和out这两个关键字都能够提供相似的功效,其作用也很像C中的指针变量。它们的区别是:
1、使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。
2、使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键字。以满足匹配。
3、out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。
注:在C#中,方法的参数传递有四种类型:传值(by value),传址(by reference),输出参数(by output),数组参数(by array)。传值参数无需额外的修饰符,传址参数需要修饰符ref,输出参数需要修饰符out,数组参数需要修饰符params。传值参数在方法调用过程中如果改变了参数的值,那么传入方法的参数在方法调用完成以后并不因此而改变,而是保留原来传入时的值。传址参数恰恰相反,如果方法调用过程改变了参数的值,那么传入方法的参数在调用完成以后也随之改变。实际上从名称上我们可以清楚地看出两者的含义–传值参数传递的是调用参数的一份拷贝,而传址参数传递的是调用参数的内存地址,该参数在方法内外指向的是同一个存储位置。

分类: .NET 标签: ,

使用XMLHTTP下载远程文件,提交内容

2010年9月22日 admin 没有评论

xmlhttp用在异步或同步通信都比较方便,.net的XMLHTTP类库更加为我们提供了很多的方便

//GET protected void  Button1_Click(object sender, EventArgs e) 
{ MSXML2.XMLHTTP _xmlhttp = new  MSXML2.XMLHTTPClass(); 
string Url = "http://kobewang.cn/readme.txt"; 
 _xmlhttp.open("GET", Url, false, null, null);
 _xmlhttp.send(""); 
if  (_xmlhttp.readyState == 4)
 { string response = _xmlhttp.responseText; 
if  (response.Length &gt; 0) { string content =  Encoding.GetEncoding("GB2312").GetString((byte[])_xmlhttp.responseBody);  Response.Write("&lt;br/&gt;responseBody:" + content); 
Response.End(); }
 else
 {  Response.Write("No Data!"); } } } 
//POST 
protected void Button2_Click(object  sender, EventArgs e)
 { MSXML2.XMLHTTP _xmlhttp = new MSXML2.XMLHTTPClass(); 
 string Url = "http://kobewang.cn/test.asp"; 
//要提交的内容 
string post =  "query=11&amp;query2=22";
 _xmlhttp.open("POST",Url,false,null,null); 
 _xmlhttp.setRequestHeader("Content-Length",post.Length.ToString());  _xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");  _xmlhttp.send(post);
 //返回的内容
 string returnStr = _xmlhttp.responseText.Trim(); 
 _xmlhttp.abort();
 _xmlhttp = null;
 Response.Write(returnStr);
 }
分类: .NET 标签: ,

ASP.NET循环处理程序

2010年9月18日 admin 没有评论

原理是运用html 的refresh 首先是在default.aspx源中,将其他都去掉 但只剩

1
2
@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs"  
Inherits="_Default"

因为要调用Default.aspx.cs来显示页面 以下是Default.aspx.cs的源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 private int PId; protected void Page_Load(object sender, EventArgs e) 
{ string id = Request.QueryString["Id"]; 
if (string.IsNullOrEmpty(id)) PId = 0; 
PId = string.IsNullOrEmpty(id) ? 0 : Convert.ToInt32(id); //业务处理 PId++;
 //处理结束,自动关闭
 if (PId == 15) 
{ Response.Write("处理完成 script window.opener=null;window.open('','_self');
window.close(); /script "); Response.End(); } 
ShowRedirect("1", "Default.aspx?Id="+PId, "循环处理中,当前:"+PId); } 
//输出页面,建议写在公用类库中 
public static void ShowRedirect(string sec, object reurl, string msg)
 { if (reurl == null) { reurl = "/"; } 
string str; str = "html head meta http-equiv=Content-Type content='text/html; charset=gb2312'\n"; 
str += "META NAME=\"GOOGLEBOT\" CONTENT=\"NOINDEX, NOFOLLOW\"*";
 str += "meta http-equiv=refresh content='" + sec + "; url=" + reurl + "'"; 
str += "title 信息提示:(" + sec + "秒后自动返回) /title";
 str += "/head body";
 str += "table width=\"400\" height=\"119\" border=\"0\" align=\"center\" cellpadding=\"2\" 
cellspacing=\"1\" bgcolor=\"#3366CC\" style=\"font-size: 14.8px;\" "; 
str += "tr td height=\"27\" bgcolor=\"#999999\" font color=\"#FFFFFF\" 
b 信息提示:(" + sec + "秒后自动返回) /b /font /td"; str += " /tr "; str += " tr "; str += " td align=\"center\" bgcolor=\"#ffffff\" " + msg + " br a href='" + reurl + "' 如果不想等待请点这里返回! /a /td";
 str += " /tr "; 
str += "/table /body /html "; System.Web.HttpContext.Current.Response.Write(str); System.Web.HttpContext.Current.Response.End(); }
分类: .NET 标签: