HANLEI'BLOG

迷失的人迷失了,相逢的人会再相逢

C#之Npoi操作EXCEL方法

Npoi是一个非微软的第三方Office操作类库,能够读写几乎所有的Office 97-2003文件格式。
我们只要引入它的两个库文件,就可以操作excel等Office文件,而不用担心客户有没有装office。

最常用的就是操作excel了,下面例出几个示列代码。

//引用类库:

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;

//创建excel:

    //创建xls文件
    private void button1_Click(object sender, EventArgs e)
    {
        //创建工作薄
        HSSFWorkbook wk = new HSSFWorkbook();
        //创建一个名称为mySheet的表
        ISheet tb = wk.CreateSheet("mySheet"); 
        //创建一行,此行为第二行
        IRow row = tb.CreateRow(1);
        for (int i = 0; i < 20; i++)    
        {
            ICell cell = row.CreateCell(i);  //在第二行中创建单元格
            cell.SetCellValue(i);//循环往第二行的单元格中添加数据
        }
        using (FileStream fs = File.OpenWrite(@"c:/myxls.xls")) //打开一个xls文件,如果没有则自行创建,如果存在myxls.xls文件则在创建是不要打开该文件!
        {
            wk.Write(fs);   //向打开的这个xls文件中写入mySheet表并保存。
            MessageBox.Show("提示:创建成功!");
        }
    }

//读取excel

    private void button2_Click(object sender, EventArgs e)
    {   StringBuilder sbr = new StringBuilder();
        using (FileStream fs = File.OpenRead(@"c:/myxls.xls"))   //打开myxls.xls文件
        {
            HSSFWorkbook wk = new HSSFWorkbook(fs);   //把xls文件中的数据写入wk中
            for (int i = 0; i < wk.NumberOfSheets; i++)  //NumberOfSheets是myxls.xls中总共的表数
            {
                ISheet sheet = wk.GetSheetAt(i);   //读取当前表数据
                for (int j = 0; j <= sheet.LastRowNum; j++)  //LastRowNum 是当前表的总行数
                {
                    IRow row = sheet.GetRow(j);  //读取当前行数据
                    if (row != null)
                    {
                        sbr.Append("-------------------------------------\r\n"); //读取行与行之间的提示界限
                        for (int k = 0; k <= row.LastCellNum; k++)  //LastCellNum 是当前行的总列数
                        {
                            ICell cell = row.GetCell(k);  //当前表格
                            if (cell != null)
                            {                                   
                                sbr.Append(cell.ToString());   //获取表格中的数据并转换为字符串类型
                            }
                        }
                    }
                }
            }               
        }
        sbr.ToString();
        using (StreamWriter wr = new StreamWriter(new FileStream(@"c:/myText.txt", FileMode.Append)))  //把读取xls文件的数据写入myText.txt文件中
        {
            wr.Write(sbr.ToString());
            wr.Flush();
        }
        
    }

HANLEI 2017 年 06 月 15 日 暂无评论

pyquery自动闭合空标签的解决办法

用pyquery对像的html方法获取网页内容,如果内容有空的标签如

from pyquery import PyQuery as pq
html="<h3></h3>"
a=pq(html)
print(a.html())

因为<h3></h3>中间没有内容,pyquery会自到闭合标签,输出后就变成了

<h3/>

这样得到的HTML内容很容易显视不正常,格式会乱掉。
解决办法是给html方法加参数如下

from pyquery import PyQuery as pq
html="<h3></h3>"
a=pq(html)
print(a.html(method='html'))

HANLEI 2017 年 05 月 17 日 暂无评论

关于这几天研究"微信公众号采集"的成果报告

生活总是在以为自己快要很得意的时候让你焦头烂额
前些天学习用python做网站采集,有些成果。于是就又想搞微信公众号的采集。因为之前想用PHP做过,研究了一下发现基本不可能。现在有了更专业的工具就又想试试了。因为我只知道搜狗有公众号的搜索,所以就打算从搜狗开始。

到目前为止做了以下工作

  1. 采集时要先访问一下搜狗首页,记录COOKIES,采集时都要带上。因为搜索肉容的链接和图片的访问都要验证COOKIES,没有可不行。

  2. 因为要有目标的采集所以就要用到搜索,但又不能直接跳到搜索结果页(会自动转到首页)。我用phantomjs在搜索首页调用js实现模拟表单提交,结果页就出来了。

  3. 不断的调试,因为还要发到自己的网站后台。

到目前为止的结果
就在刚才出现:"用户您好,您的访问过于频繁,为确认本次访问为正常用户行为,需要您协助验证。"。访问要输验证码。这我就没办法了。

微信公众号采集计划 终止

HANLEI 2017 年 05 月 12 日 暂无评论

python发送POST请求时的cookies和session

需要用python模拟登录后,模拟发表文章。但没学过phthon所以一直在百度。

self.ckjar = cookielib.MozillaCookieJar("cookies.txt")
ckproc = urllib2.HTTPCookieProcessor(self.ckjar)
self.opener = urllib2.build_opener(ckproc)
urllib2.install_opener(self.opener)
post_data = urllib.urlencode({
        'username' : username,
        'password' : password,
})
#发送登录POST
post_url = 'http://www.test.com/login'
req = urllib2.Request(url = post_url, data = post_data)
resp = urllib2.urlopen(req)
tem = resp.read()
resp.close()
self.ckjar.save(ignore_discard=True, ignore_expires=True)

这段代码是为urllib2操作统一添加cookies,可以正常登录并发表文章。又需要上传图片,网上找到代码如下

datagen, headers = multipart_encode({"file": open("test.jpeg", "rb")}) 
post_url = 'http://www.test.com/webuploader.php'
request = urllib2.Request(post_url, datagen, headers)
resp = urllib2.urlopen(request) 

图片可以正常发送,但是没有带cookies登录信息,不明白,找到下面的代码解决了

from poster.encode import multipart_encode  
from poster.streaminghttp import register_openers 

opener = register_openers()
opener.add_handler(urllib2.HTTPCookieProcessor(self.ckjar))
resp = urllib2.urlopen(request)
content = resp.read()

虽然还是有些不明所以,但也没有太多精力去研究,就这样吧。

HANLEI 2017 年 05 月 10 日 暂无评论

lnmp为编译安装的php安装扩展

编译安装PHP的时候没有安装fileinfo扩展,现在需要但不想重新编译安装php,可以使用以下方法。

  1. 跳转到fileinfo源代码目录 cd /root/downloads/php-5.6.9/ext/fileinfo/

  2. 执行 /usr/local/php/bin/phpize

  3. 执行 ./configure --with-php-config=/usr/local/php/bin/php-config

  4. 执行 make && make install

  5. 修改php.ini文件 vi /usr/local/php/etc/php.ini 在末尾增加extension = fileinfo.so即可

  6. 重启php-fpm ,/etc/init.d/php-fpm reload

以上方法同时适应于其它PHP扩展,只要进入相应的扩展目录编译即可。

HANLEI 2017 年 05 月 09 日 暂无评论

linux远程复制文件夹乱码,文件备份迁移的简单方法

事件的详情是这样的,有一台redhat5的服务器想要重装系统,系统的默认字符编码是GBK,服务器内的文件有大量中文文件名都是GBK编码。因为服务器上装有FTP服务,所有我在另一台备份机上安装lftp,通过mirror进行文件夹复制,正常复制完成,检查无错。

$ lftp 192.168.0.111    //连接FTP服务器
lftp 192.168.0.111:~> user admin    //用户登录,输入密码
口令: 
lftp admin@192.168.0.111:~> mirror ./ ./    //将FTP根目录复制到当装目录

系统装完后再利用lftp回拷文件的时候出错了,所有GBK编码的文件都无法复制,错误提示:

mirror: Access failed: 550 Can't change directory to ???: No such file or directory

编码的问题,因为文件中的GBK和UTF8都存在,没有找到好的解决方法,只好另找途径。结果发现了比FTP更有效的复制方法:scp

scp -r /home/test/ root@192.168.1.100:/root/

scp是通过SSH登录复制,复制文件夹要加-r
两个参数分别是本地路径和远程路径,执行下载文件,颠倒后为上传文件。命令执行后会提示输入远程用户的密码。拷贝过程不受编码影响。
如果sshd的端口号不是默认的22需要指定端口号

scp -r -P33222 /home/test/ root@192.168.1.100:/root/

HANLEI 2017 年 05 月 02 日 暂无评论

phantomjs错误cannot connect to X server处理方法

安装phantomjs后运行出错:cannot connect to X server
下面是解决方法:

$: Xvfb :2 -screen 0 800x600x24 2> /dev/null &
$: export DISPLAY=:2.0

也适用于其它程序的报错,解决的思路就是建立一个虚拟的图形界面然后设置为当前输出界面。

HANLEI 2017 年 05 月 02 日 暂无评论

nginx+php网站偶尔出现No input file specified.

没有预见性的,不定时的就会出现No input file specified.然后一刷新又正常了。
网上查找到了相关的处理方法
PHP偶尔出现No input file specified.错误

我的错误日志没有错误记录,不过我的问题也应该出在php-fpm进程太多。删除进程并重起php-fpm后一切回归正常。

HANLEI 2017 年 04 月 02 日 暂无评论

PHP跨根目录访问脚本的权限问题

关与这个标题总结不知道对不对,其实我遇到的问题更具体一些。

我的服务器安装的是lnmp.org的一键安装包,新建主机后会分配一个目录,这个目录就是网站的根目录/site。现在我要安装一个thinkphp5的网站,它的网站根目录需要设为/site/public,由/site/public/index.php来加载/site/app等其它目录的脚本。于是我在nging配置文件中将网站root根目录改为/site/public。然后就出问题,网站无法访问。分析后发现public下的脚本没有权限加载app等目录的脚本,只有根目录public下的文件权限。

经过查找资料发现这是PHP的一个安全隔离防跨站的功能,要在php.ini内设置站点可访问目录

open_basedir=/home/www/www.aaa.com:/tmp/:/proc/

lnmp在“/usr/local/nginx/conf/fastcgi.conf”这个文件中对此参数进行了统一设置

fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";

找到了问题所在只要稍作修改就可以了,我将fastcgi.conf内的设置注释掉,然后在vhost的配置文件单独加入

fastcgi_param PHP_ADMIN_VALUE "open_basedir=/home/wwwroot/site/:/tmp/:/proc/";

HANLEI 2017 年 04 月 01 日 暂无评论

yum提示“段错误 (core dumped)”的解决方法

换了国内的YUM源,结果出现错误无法运行。以为是YUM源的问题,换回旧的源还是出错,百度了一下发现大都是因为zlib的库文件存在多个版本而导至的,正好前两天因为版本需要编译安装了新版的zlib,所以基本确定问题所在了。

[root@mail ~]# yum makecache
Loading "security" plugin
Loading "installonlyn" plugin
Loading "rhnplugin" plugin
This system is not registered with RHN.
RHN support will be disabled.
Setting up repositories
base                      100% |=========================| 1.1 kB    00:00     
updates                   100% |=========================| 1.9 kB    00:00     
addons                    100% |=========================| 1.9 kB    00:00     
extras                    100% |=========================| 2.1 kB    00:00     
primary.xml.gz            100% |=========================| 1.3 MB    00:00     
段错误

然而按网上的提示处理后,还是出错,将RPM包卸载后问题依旧,最终重新装回系统的zlib RPM包,然后动新版的zlib编译目录将新版zlib卸载后终于恢复了正常。

[root@mail zlib-1.2.11]# make uninstall
cd /usr/local/include && rm -f zlib.h zconf.h
cd /usr/local/lib && rm -f libz.a; \
        if test -n "libz.so.1.2.11" -a -f libz.so.1.2.11; then \
          rm -f libz.so.1.2.11 libz.so libz.so.1; \
        fi
cd /usr/local/share/man/man3 && rm -f zlib.3
cd /usr/local/lib/pkgconfig && rm -f zlib.pc

HANLEI 2017 年 03 月 31 日 暂无评论