常见.NET功能代码汇总 (3)
33,彻底关闭Excel进程
.NET中使用Excel属于使用非托管资源,使用完成后一般都要用GC回收资源,但是,调用GC的位置不正确,Excel进程可能无法彻底关闭,如下面的代码:
static void OpenExcelTest(int j)
{
//Application excel = null;
excel = new Application();
excel.Visible = true;
excel.Workbooks.Open("d:\\A1000.xla");
Workbook wb = excel.Application.Workbooks.Open("d:\\Book1.xlsx");
Worksheet sh = wb.Worksheets.Item["Sheet1"];
object[,] ssss = sh.Range[sh.Cells[1.1], sh.Cells[, ]].Value2;
Console.WriteLine("opened excel no. {0}", j);
Console.ReadLine(); try
{
//尝试程序关闭Excel进程
wb.Close(false);
sh = null;
wb = null;
excel.Quit();
}
catch (Exception ex)
{
Console.WriteLine("用户已经手工结束了Excel进程,内部错误消息:{0}",ex.Message );
} int generation = System.GC.GetGeneration(excel); //No.1
//System.Runtime.InteropServices.Marshal.ReleaseComObject(wb);
//System.Runtime.InteropServices.Marshal.ReleaseComObject(sh);
//System.Runtime.InteropServices.Marshal.ReleaseComObject(excel); excel = null;
//No.2
//GC.Collect(generation); Console.WriteLine("close excel no. {0}", j);
Console.ReadLine();
}
在上面的代码中,如果取消 No.1,No.2位置处的注释,方法结束后,Excel进程是无法结束的,解决办法,只需要把
GC.Collect();
这行代码写到方法之外即可。
Application excel = null;
这个Excel应用程序对象定义在方法内或者外都是可以的,哪怕定义一个静态变量,结果都没有影响。
34,给ZIP文件添加文件头
将很多零散的文件打包成ZIP文件方便使用,但是ZIP文件使用相关的工具很容易解压,并且无法判断该文件是指定的文件。可以给ZIP文件增加文件头内容,在文件头里面写入要验证的标记。采用这种方式,加了标记的ZIP文件仍然可以被ZIP工具打开,从而制作只有自己能用的ZIP文件。
/// <summary>
/// 创建文件包
/// </summary>
/// <param name="userName">打包文件的用户名</param>
/// <param name="savePath">保存的文件包路径</param>
/// <param name="files">文件清单</param>
/// <param name="businessID">业务ID</param>
/// <param name="pkgVersion">文件包版本号</param>
/// <returns>文件包全路径</returns>
public string CreatePackage(string userName, string savePath, List<string> files, string businessID,string pkgVersion="")
{
//DataPackages 存放导入导出项目文件包的目录,以此目录打包,最终压缩文件存放目录为用户指定路径下
//每次生成一个临时目录
string tempDir = DateTime.Now.ToString("yyyyMMddHHmmss");
string pkgDirRoot = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "Packages");
string pkgDir = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "Packages", businessID, tempDir);
string pkgSaveFile = System.IO.Path.Combine(savePath, "SODPackage_"+ tempDir + ".pkg");
string pkgSaveFileTemp = System.IO.Path.Combine(savePath,"SODPackage_"+ tempDir + ".tmp"); try
{
if (!System.IO.Directory.Exists(pkgDir))
System.IO.Directory.CreateDirectory(pkgDir);
StringBuilder sb = new StringBuilder();
//复制文件到压缩目录
foreach (string file in files)
{
int index = file.IndexOf(businessID);
if (index > )
{ //假设给出的文件路径中都包含了业务ID
string subStr = file.Substring(index + businessID.Length+);
string targetFile = System.IO.Path.Combine(pkgDir, subStr);
string targetDir = System.IO.Path.GetDirectoryName(targetFile);
if (!System.IO.Directory.Exists(targetDir))
System.IO.Directory.CreateDirectory(targetDir);
System.IO.File.Copy(file, targetFile);
sb.AppendLine(subStr);
}
}
//写一个清单文件
string infoFile = System.IO.Path.Combine(pkgDir, "info.txt");
string infoText = string.Format("RemoteServer={0}\r\nUserName={1}\r\nProjectID={2}\r\nProjectName={3}\r\nData Version={4}\r\nPackage Dir={5}\r\nPackage Files List:\r\n{6}",
remoteServer, userName,
businessID,projectName,
pkgVersion,
pkgDir, sb.ToString());
System.IO.File.AppendAllText(infoFile, infoText); System.IO.Compression.ZipFile.CreateFromDirectory(pkgDir, pkgSaveFileTemp);
//添加文件头,第一个整数字节,为文件头长度
using (var fs = System.IO.File.Create(pkgSaveFile))
{
System.IO.BinaryWriter bw = new System.IO.BinaryWriter(fs); string headStr = string.Format("XXXPackage&{0}&{1}&{2}", businessID, pkgVersion,userName);
var headData = System.Text.Encoding.UTF8.GetBytes(headStr);
bw.Write(headData.Length);
bw.Write(headData); var fileData = System.IO.File.ReadAllBytes(pkgSaveFileTemp);
bw.Write(fileData, , fileData.Length);
bw.Close();
fs.Close();
}
System.IO.File.Delete(pkgSaveFileTemp);
return pkgSaveFile;
}
catch (Exception ex)
{
throw new Exception("打包项目文件失败:"+ex.Message, ex);
}
}
创建文件包
这里用到了方法:
System.IO.Compression.ZipFile.CreateFromDirectory(pkgDir, pkgSaveFileTemp);
需要程序引用2个程序集文件,并且需要.NET 4.5以后才支持:
System.IO.Compression;
System.IO.Compression.ZipFile;
下面是解压的方法:
/// <summary>
/// 解压缩包文件,包括处理数据文件
/// </summary>
/// <param name="pkgFile">用户指定的包文件路径,会校验此文件格式</param>
/// <param name=" businessID">需验证的包文件相关的业务ID</param>
/// <param name="pkgVersion">需要验证的文件包版本</param>
/// <returns></returns>
public string UnZipPackage(string pkgFile, string businessID,string pkgVersion="")
{
if (!System.IO.File.Exists(pkgFile))
throw new Exception("指定的文件不存在:"+ pkgFile); string tempDir = DateTime.Now.ToString("yyyyMMddHHmmss");
string pkgDirRoot = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "Packages");
string pkgDir = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "Packages", tempDir);
string pkgFileTemp = System.IO.Path.Combine(System.IO.Path.GetTempPath(), System.DateTime.Now.Ticks.ToString()+ "_Package.tmp");
try
{
if (!System.IO.Directory.Exists(pkgDir))
System.IO.Directory.CreateDirectory(pkgDir); using (var fs = System.IO.File.OpenRead(pkgFile))
{
System.IO.BinaryReader br = new System.IO.BinaryReader(fs);
//校验文件头,第一个整数字节,为文件头长度
int headLenth = br.ReadInt32();
if (headLenth > )
throw new Exception("包文件格式不正确!");
byte[] headData = new byte[headLenth]; int count= br.Read(headData, , headData.Length);
string tempStr = System.Text.Encoding.UTF8.GetString(headData);
string[] tempArr = tempStr.Split('&');
if(tempArr.Length<= || tempArr[]!= "XXXPackage")
throw new Exception("包文件格式不正确!");
if (tempArr[] != businessID)
throw new Exception("不是此项目的数据包文件!\r\n(数据包业务ID="+tempArr[]+",目标ID="+businessID+")");
if (tempArr[] != pkgVersion)
throw new Exception("数据包版本号不正确!\r\n(数据包版本号=" + tempArr[] + ",目标版本号="+pkgVersion+")"); byte[] buffer = new byte[];
using (var fw = System.IO.File.OpenWrite(pkgFileTemp))
{
while (count > )
{
count = br.Read(buffer, , buffer.Length);
if(count>)
fw.Write(buffer, , count);
}
fw.Close();
}
br.Close();
fs.Close();
} System.IO.Compression.ZipFile.ExtractToDirectory(pkgFileTemp, pkgDir);
System.IO.File.Delete(pkgFileTemp); return pkgDir;
}
catch (Exception ex)
{
throw new Exception("解压缩项目文件失败:"+ex.Message, ex);
}
}
文件包验证和解压
有了这种方式,在解压文件之前就可以验证文件信息,这对于非常大的压缩文件很有用。
35,利用SOD框架,导出MySQL数据库表数据
MySQL可以通过 SELECT * INTO OUTFILE 的方式,将查询结果的数据导出到一个文本文件,然后再导入此文件的数据到另外一个MySQL数据库.
SOD框架提供了 DbContext 类型,继承它可以检查并创建使用到的所有表,然后用 ResolveAllEntitys() 方法即可获取所有使用的实体类。
例如:下面是导出库中包含指定产品的表的所有数据
void ExportMySQLData(string ProductID )
{
AdoHelper ado = MyDB.GetDBHelperByConnectionName("mySqlDb"); DbContext context = new MyDbContext(ado);
var entitys = context.ResolveAllEntitys();
StringBuilder sb = new StringBuilder();
foreach (EntityBase entity in entitys)
{
var tableName = entity.GetTableName();
var path = Path.Combine("D:\MySQLExportPath”, tableName + ".txt");
path = path.Replace(@"\", "/");
if (entity.PropertyNames.Contains("BusinessID"))
{
sb.AppendLine("SELECT * INTO OUTFILE ");
sb.AppendLine("'" + path + "'");
sb.AppendLine(" FIELDS TERMINATED BY '^`' ");
sb.AppendLine("OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY "); sb.AppendLine(" FROM ");
sb.AppendLine(tableName);
sb.AppendLine(" WHERE ");
sb.Append("ProductID='" + ProductID + "'");
}
}
}
导出数据
导入数据也比较简单,直接用AdoHelper对象的ExecuteNonQuery 方法执行文件导入的SQL语句即可,看下面代码:
void ImportMySQLData(List<string> fileList)
{
AdoHelper ado = MyDB.GetDBHelperByConnectionName("mySqlDb1");
ado.CommandTimeOut = ;
StringBuilder sb = new StringBuilder();
foreach (var file in fileList)
{
sb.Clear();
var tableName = Path.GetFileNameWithoutExtension(file);
var path = file.Replace(@"\", "/");
sb.AppendLine("LOAD DATA INFILE ");
sb.AppendLine("'" + path + "'");
sb.AppendLine(" Replace INTO TABLE ");
sb.AppendLine(tableName);
sb.AppendLine(" FIELDS TERMINATED BY '^`' ");
sb.AppendLine("OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY "); ado.ExecuteNonQuery(sb.ToString());
}
}
导入数据
36,使用Power Shell 打开Word并插入文字
Power Shell是很强的脚本语言,将下面的代码存为后缀名是 ps1 格式的文件,然后打开文件,点击运行,即可打开Word,并且插入两行文字。第一行是系统时间,第二行是计算机名字。
$word=new-object -ComObject "Word.Application"
$doc =$word.documents.Add()
$word.Visible = $true
$selection=$word.Selection
$selection.TypeText((Get-Date).ToString())
$selection.TypeParagraph() $os=Get-WmiObject -class win32_OperatingSystem
$selection.TypeText("Operating System Information for $($os.CSName)")
37,使用VBA删除Word文档中标记为灰色的文字,外加导出PDF功能
将下面代码写到VBA工程中,然后在宏上调用。
删除灰色文字(GRB 217, 217, 217),调用 RemoveSpecialWords 方法
导出PDF,调用 ExportPDF 方法:
Function ExportPDF() As String
Dim fileName As String
Dim fd As FileDialog, i As Integer Set fd = Application.FileDialog(msoFileDialogSaveAs)
With fd
For i = To .Filters.Count
If .Filters(i).Extensions = "*.pdf" Then Exit For
Next
.FilterIndex = i
If .Show = - Then
fileName = .SelectedItems()
MsgBox fileName
Else
ExportPDF = ""
Exit Function
End If
End With If fd.Filters(fd.FilterIndex).Extensions <> "*.pdf" Then
MsgBox "只能导出为PDF格式文件!", vbCritical, "导出报告"
ExportPDF = ""
Exit Function
End If If fileName <> "" Then
ActiveDocument.ExportAsFixedFormat OutputFileName:=fileName, _
ExportFormat:=wdExportFormatPDF, _
OpenAfterExport:=False, OptimizeFor:=wdExportOptimizeForPrint, Range:= _
wdExportAllDocument, From:=, To:=, Item:=wdExportDocumentContent, _
IncludeDocProps:=True, KeepIRM:=True, CreateBookmarks:= _
wdExportCreateNoBookmarks, DocStructureTags:=True, BitmapMissingFonts:= _
True, UseISO19005_1:=False MsgBox "导出成功!", vbInformation, "导出报告"
End If
ExportPDF = fileName
End Function '删除文档中所有的灰色文字,GRB:217,217,217
'
Sub RemoveSpecialWords()
Dim n As Integer ', Info As String With Selection.Find
.Parent.HomeKey wdStory
.ClearFormatting
.Font.Color = wdColorGray15 Do While .Execute
n = n +
'Info = Info & n & vbTab & .Parent & vbCrLf '提取找到的文本
.Parent.Delete '删除找到的文本 Loop End With
If n > Then MsgBox "删除标记文本数量 " & n & " 处!" End Sub Function GetSaveAsFileName(ByVal pdfFile As String) As String
Dim rptWordFile As String
If pdfFile <> "" Then
Dim fileNoExt As String fileNoExt = Left(pdfFile, Len(pdfFile) - ) ' .pdf
rptWordFile = fileNoExt + ".docm" Else
rptWordFile = ""
End If
GetSaveAsFileName = rptWordFile
End Function Sub ExportMyPDF()
'
' ExportMyPDF 宏
' 删除灰色文字,导出PDF文件
'
Dim pdfFile As String
RemoveSpecialWords
pdfFile = ExportPDF Dim rptWordFile As String
rptWordFile = GetSaveAsFileName(pdfFile)
If rptWordFile <> "" Then
ActiveDocument.SaveAs fileName:=rptWordFile
End If 'Documents.Close (False)
'Dim wordFile As String
'wordFile = GetSaveAsFileName("e:\doc\43887ad1-c504-490d-a6a2-dfa616164f9e.pdf")
'MsgBox wordFile End Sub
下面的方法查找到指定内容的段落并改变段落文字颜色做标记(可用于删除):
Sub 查找段落()
'
' 查找段落 宏
' 查找段落,删除段落
'
Dim s As String
Dim count As Integer
Dim currRange As Range
Dim currCctr As ContentControl
Dim title As String s = "要删除"
'先找到Word内容控件,然后判断值是否是0,如果是,置于整个自然段为灰色
For i = ActiveDocument.Paragraphs.count To Step -
Set currRange = ActiveDocument.Paragraphs(i).Range If InStr(currRange.text, s) > Then For c = To currRange.ContentControls.count
Set currCctr = currRange.ContentControls(c)
title = currCctr.title
If currCctr.Type = wdContentControlText Then
currCctr.Range.text = "123 测试内容"
End If
Next
'currRange.Delete
'不真正删除,只是先设置成灰色,便于报告导出的时候,再删除
currRange.Font.Color = wdColorGray05
count = count +
End If
Next
MsgBox "删除找到的段落 " & count & " 处!"
End Sub
38, 通过命令行打开一个Word文件
通过start命令即可:
start winword.exe "文件1.docx"
常见.NET功能代码汇总 (3)的更多相关文章
- 常见.NET功能代码汇总 (2)
常见.NET功能代码汇总 23,获取和设置分级缓存 获取缓存:首先从本地缓存获取,如果没有,再去读取分布式缓存写缓存:同时写本地缓存和分布式缓存 private static T GetGradeCa ...
- 常见.NET功能代码汇总
1,在Web上修改指定文件位置的Web.config 这里需要使用 WebConfigurationManager 类,但必须使用WebConfigurationFileMap类来指定文件位置,看代码 ...
- java开发功能代码汇总
多文件上传 http://smotive.iteye.com/blog/1903606 java 常用代码 Struts2 前后台(Action ,jsp)传值.取值 Action public Li ...
- js 技巧 (六)弹窗代码汇总
弹窗代码汇总 [0.超完美弹窗代码] 功能:5小时弹一次+背后弹出+自动适应不同分辩率+准全屏显示 代码: <script> function openwin(){ window.open ...
- leetcode常见算法与数据结构汇总
leetcode刷题之后,很多问题老是记忆不深刻,因此特意开此帖: 一.对做过题目的总结: 二.对一些方法精妙未能领会透彻的代码汇总,进行时常学习: 三.总结面试笔试常见题目,并讨论最优解法及各种解法 ...
- 原生JS实现购物车结算功能代码+zepto版
html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...
- Magento Table Rate运费国家代码汇总
Magento Table Rate是三种内置未调用第三方API运费方式中最强大的一个.通过设置国家,区域,邮编,价格来划分不同的运费等级.该方式基本能够满足轻量级的B2C商城的运费模式.这里收集下国 ...
- 通过javascript库JQuery实现页面跳转功能代码
通过javascript库JQuery实现页面跳转功能代码的四段代码实例如下. 实例1: 1 2 3 4 $(function(){ var pn = $("#gotopagenum&quo ...
- 矩阵分解(rank decomposition)文章代码汇总
矩阵分解(rank decomposition)文章代码汇总 矩阵分解(rank decomposition) 本文收集了现有矩阵分解的几乎所有算法和应用,原文链接:https://sites.goo ...
随机推荐
- Python之re模块(结合具体业务)
1.判断数据库名是否合法 import re dbname = "test_" result = re.match("[a-zA-Z_0-9]{1,}$",db ...
- 73、django之setting配置汇总
前面的随笔中我们经常会改setting配置也经常将一些配置混淆今天主要是将一些常见的配置做一个汇总. setting配置汇总 1.app路径 INSTALLED_APPS = [ 'django.co ...
- ASP.NET Core缓存静态资源
背景 缓存样式表,JavaScript或图像文件等静态资源可以提高您网站的性能.在客户端,总是从缓存中加载一个静态文件,这样可以减少对服务器的请求数量,从而减少获取页面及其资源的时间.在服务器端,由于 ...
- 搭建php环境的几种方法
对于想学习php开发初学者来说,先要学习搭建php开发环境,因为要做php开发,搭建一个能够运行php网站的服务器环境是第一步,传统的php环境软件非常复杂,好在很多公司开发了一键搭建php安装环境, ...
- unity3d开发环境配置
1. 首先先下载软件包:http://pan.baidu.com/s/1imYVv 4.2版本2.下载完后,解压会看到两个文件(运行第二个安装包) 3.准备安装,这里直接上图了. 这里全选,里面包括 ...
- 《HelloGitHub》第 20 期
前言 HelloGitHub 项目已经累积到 3k+ Stars.本项能够走到今天,帮助到越来越多的人.少不了热爱开源.不断为本项目贡献项目的小伙伴们. 贡献者列表 很多人都有想法,付诸于行动在少数, ...
- redis配置文件之复制
主从复制使用slaveof将Redis实例作为另一个Redis服务器的副本. 1) Redis复制是异步的,master可以配置成如果它连接的slave没有达到给定的数量,就停止接受写入.2) 如果断 ...
- webpack构建项目
webpack构建项目 案例代码戳这里 ps:每个案例对应相应的demo,例如"案例1"对应"demo1" 一.webpack基本功能及简单案例 安装webpa ...
- ORACLE+PYTHON实战:复制A表数据到B表
最近在学习python ,看到了pythod的oracle,不仅可以一次fetch多条,也可以一次insert多条,想写一个复制A表数据到B表的程序来看看实际效率能不能提高.写完发现,非常惊艳!效率提 ...
- HDU1541--Stars(树状数组)
Stars Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...