1、整个Excel表格叫做工作表:WorkBook(工作薄),包含的叫页(工作表):Sheet;行:Row;单元格Cell。 2、NPOI是POI的C#版本,NPOI的行和列的index都是从0开始 3、POI读取Excel有两种格式一个是HSSF,另一个是XSSF。 HSSF和XSSF的区别如下: HSSF is the POI Project’s pure Java implementation of the Excel ’97(-2007) file format. XSSF is the POI Project’s pure Java implementation of the Excel 2007 OOXML (.xlsx) file format. 即:HSSF适用2007以前的版本,XSSF适用2007版本及其以上的。 下面是用NPOI读写Excel的例子:ExcelHelper封装的功能主要是把DataTable中数据写入到Excel中,或者是从Excel读取数据到一个DataTable中。 ExcelHelper类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using NPOI.HSSF.UserModel; using System.IO; using System.Data; namespace NetUtilityLib { public class ExcelHelper : IDisposable { private string fileName = null; //文件名 private IWorkbook workbook = null; private FileStream fs = null; private bool disposed; public ExcelHelper(string fileName) { this.fileName = fileName; disposed = false; } /// <summary> /// 将DataTable数据导入到excel中 /// </summary> /// <param name="data">要导入的数据</param> /// <param name="isColumnWritten">DataTable的列名是否要导入</param> /// <param name="sheetName">要导入的excel的sheet的名称</param> /// <returns>导入数据行数(包含列名那一行)</returns> public int DataTableToExcel(DataTable data, string sheetName, bool isColumnWritten) { int i = 0; int j = 0; int count = 0; ISheet sheet = null; fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite); if (fileName.IndexOf(".xlsx") > 0) // 2007版本 workbook = new XSSFWorkbook(); else if (fileName.IndexOf(".xls") > 0) // 2003版本 workbook = new HSSFWorkbook(); try { if (workbook != null) { sheet = workbook.CreateSheet(sheetName); } else { return -1; } if (isColumnWritten == true) //写入DataTable的列名 { IRow row = sheet.CreateRow(0); for (j = 0; j < data.Columns.Count; ++j) { row.CreateCell(j).SetCellValue(data.Columns[j].ColumnName); } count = 1; } else { count = 0; } for (i = 0; i < data.Rows.Count; ++i) { IRow row = sheet.CreateRow(count); for (j = 0; j < data.Columns.Count; ++j) { row.CreateCell(j).SetCellValue(data.Rows[i][j].ToString()); } ++count; } workbook.Write(fs); //写入到excel return count; } catch (Exception ex) { Console.WriteLine("Exception: " + ex.Message); return -1; } } /// <summary> /// 将excel中的数据导入到DataTable中 /// </summary> /// <param name="sheetName">excel工作薄sheet的名称</param> /// <param name="isFirstRowColumn">第一行是否是DataTable的列名</param> /// <returns>返回的DataTable</returns> public DataTable ExcelToDataTable(string sheetName, bool isFirstRowColumn) { ISheet sheet = null; DataTable data = new DataTable(); int startRow = 0; try { fs = new FileStream(fileName, FileMode.Open, FileAccess.Read); if (fileName.IndexOf(".xlsx") > 0) // 2007版本 workbook = new XSSFWorkbook(fs); else if (fileName.IndexOf(".xls") > 0) // 2003版本 workbook = new HSSFWorkbook(fs); if (sheetName != null) { sheet = workbook.GetSheet(sheetName); if (sheet == null) //如果没有找到指定的sheetName对应的sheet,则尝试获取第一个sheet { sheet = workbook.GetSheetAt(0); } } else { sheet = workbook.GetSheetAt(0); } if (sheet != null) { IRow firstRow = sheet.GetRow(0); int cellCount = firstRow.LastCellNum; //一行最后一个cell的编号 即总的列数 if (isFirstRowColumn) { for (int i = firstRow.FirstCellNum; i < cellCount; ++i) { ICell cell = firstRow.GetCell(i); if (cell != null) { string cellValue = cell.StringCellValue; if (cellValue != null) { DataColumn column = new DataColumn(cellValue); data.Columns.Add(column); } } } startRow = sheet.FirstRowNum + 1; } else { startRow = sheet.FirstRowNum; } //最后一列的标号 int rowCount = sheet.LastRowNum; for (int i = startRow; i <= rowCount; ++i) { IRow row = sheet.GetRow(i); if (row == null) continue; //没有数据的行默认是null DataRow dataRow = data.NewRow(); for (int j = row.FirstCellNum; j < cellCount; ++j) { if (row.GetCell(j) != null) //同理,没有数据的单元格都默认是null dataRow[j] = row.GetCell(j).ToString(); } data.Rows.Add(dataRow); } } return data; } catch (Exception ex) { Console.WriteLine("Exception: " + ex.Message); return null; } } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (!this.disposed) { if (disposing) { if (fs != null) fs.Close(); } fs = null; disposed = true; } } } } |
测试代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; namespace NPOIExcelExample { class Program { static DataTable GenerateData() { DataTable data = new DataTable(); for (int i = 0; i < 5; ++i) { data.Columns.Add("Columns_" + i.ToString(), typeof(string)); } for (int i = 0; i < 10; ++i) { DataRow row = data.NewRow(); row["Columns_0"] = "item0_" + i.ToString(); row["Columns_1"] = "item1_" + i.ToString(); row["Columns_2"] = "item2_" + i.ToString(); row["Columns_3"] = "item3_" + i.ToString(); row["Columns_4"] = "item4_" + i.ToString(); data.Rows.Add(row); } return data; } static void PrintData(DataTable data) { if (data == null) return; for (int i = 0; i < data.Rows.Count; ++i) { for (int j = 0; j < data.Columns.Count; ++j) Console.Write("{0} ", data.Rows[i][j]); Console.Write("\n"); } } static void TestExcelWrite(string file) { try { using (ExcelHelper excelHelper = new ExcelHelper(file)) { DataTable data = GenerateData(); int count = excelHelper.DataTableToExcel(data, "MySheet", true); if (count > 0) Console.WriteLine("Number of imported data is {0} ", count); } } catch (Exception ex) { Console.WriteLine("Exception: " + ex.Message); } } static void TestExcelRead(string file) { try { using (ExcelHelper excelHelper = new ExcelHelper(file)) { DataTable dt = excelHelper.ExcelToDataTable("MySheet", true); PrintData(dt); } } catch (Exception ex) { Console.WriteLine("Exception: " + ex.Message); } } static void Main(string[] args) { string file = "..\\..\\myTest.xlsx"; TestExcelWrite(file); TestExcelRead(file); } } } |
Excel相关DLL下载:NPOI-Lib.rar 1.NPOI下载地址:http://npoi.codeplex.com/releases/view/38113 2.NPOI学习系列教程推荐:http://www.cnblogs.com/tonyqus/archive/2009/04/12/1434209.html 参考: http://www.cnblogs.com/Erik_Xu/archive/2012/06/08/2541957.html http://www.cnblogs.com/linzheng/archive/2010/12/20/1912137.html http://www.cnblogs.com/knowledgesea/archive/2012/11/16/2772547.html from:http://www.cnblogs.com/luxiaoxun/p/3374992.html
View Details原文地址: http://msdn.microsoft.com/en-us/library/gg715124(v=vs.103) 使用 EF 4.1 或者更新版本, 你可以直接执行任何数据库命令. 在本节介绍的方法允许你对数据库执行原生的 SQL 命令. 通过 SQL 查询语句获取实体对象集 DbSet 类中的 SqlQuery 方法允许你执行一个返回实体对象集的原生 SQL 查询. 默认情况下, 返回的对象集会被上下文跟踪; 这可以通过对方法返回的 DbSqlQuery 对象调用 AsNoTracking 方法取消.返回的结果集一般为 DbSet 所对应的类型, 否则即便是其派生类也无法返回. 如果所查询的表包含了其他实体类型的数据, 那么所执行的 SQL 语句应该被正确书写, 保证只返回指定类型实体的数据. 下面的例子使用 SqlQuery 方法执行了一个 SQL 查询, 返回一个 Department 类型的实例集.
1 2 3 4 5 |
1 using (var context = new SchoolEntities()) 2 { 3 var departments = context.Departments.SqlQuery( 4 "select * from Department").ToList(); 5 } |
译注: AsNoTracking 方法必须再查询执行前调用, 查询执行后调用无效. 通过 SQL 查询获取非实体对象集 通过 Database 类中的 SqlQuery 方法来执行原生 SQL 命令, 可以返回任何类型的实例, 包括 .Net 中的原生类型. 但获取的数据将不会被上下文对象跟踪, 即使我们用这个方法来检索实体对象. 如:
1 2 3 4 |
1 using (var context = new SchoolEntities()) 2 { 3 var names = context.Database.SqlQuery<string>("select Name from Department").ToList(); 4 } |
让数据库执行原生的非查询 SQL 命令 可以通过 Database 类中的 ExecuteSqlCommand 方法执行非查询命令. 例如:
1 2 3 4 |
1 using (var context = new SchoolEntities()) 2 { 3 context.Database.ExecuteSqlCommand("update Department set Name = 'Mathematics' where Name = 'Math'"); 4 } |
ExecuteSqlCommand 方法有时会被用在 Code First 创建的数据库的初始化函数中, 用来对数据库进行一些额外的配置 (例如, 设置索引). 需要注意的是, 上下文对象并不知道执行了 ExecuteSqlCommand […]
View Details相信不少使用EF的同志们已经知道如何在EF中运行SQL命令了。我在这里简单总结下,希望对大家学习EF有所帮助! 在 EF第一个版本(.NET 3.5 SP1)中,我们只能通过将ObjectContext.Connection转换为EntityConnection,再把 EntityConnection.StoreConnection转换为SqlConnection。有了这个SqlConnection,我们再创建 SqlCommand便能顺利运行SQL命令了。(个人觉得其实很烦,呵呵) 例如: EntityConnection entityConnection = (EntityConnection)ctx.Connection; DbConnection storeConnection = entityConnection.StoreConnection; DbCommand cmd = storeConnection.CreateCommand(); cmd.CommandType = System.Data.CommandType.StoredProcedure; cmd.CommandText = "[PRO_USER_DIGITALCARD_CHECK]"; 。。。。。。。 在EF4(.NET 4)中,我们有了全新的API:ObjectContext.ExecuteStoreCommand(…)和 ObjectContext.ExecuteStoreQuery<T>(…)。从函数名不难知道前者是为了执行某一并无返回集的SQL 命令,例如UPDATE,DELETE操作;后者是执行某一个查询,并可以将返回集转换为某一对象。 using (var ctx = new MyObjectContext()) { ctx.ExecuteStoreCommand("UPDATE Person SET Name = 'Michael' WHERE PersonID = 1"); } using (var ctx = new MyObjectContext()) { var peopleViews = ctx.ExecuteStoreQuery<PersonView>("SELECT PersonID, Name FROM Person"); } public class PersonView { public int PersonID { get; set; } public string Name { get; set; } } 现在有了EF4.1,API的名字又有了些许改变。如果说DbContext将ObjectContext做了包装,那么DbContext.Database就是对应于数据库端信息的封装。执行SQL命令也自然从Database类型开始。对应于ExecuteStoreCommand和ExecuteStoreQuery<T>的是Database.ExecuteSqlCommand和Database.SqlQuery<T>。 using (var ctx = new MyDbContext()) { ctx.Database.ExecuteSqlCommand("UPDATE Person SET Name = 'Michael' WHERE PersonID = 1"); } using (var ctx = new MyDbContext()) { var peopleViews = ctx.SqlQuery<PersonView>("SELECT PersonID, Name FROM Person").ToList(); } public class PersonView { public int PersonID { get; set; } public string Name { get; set; } } from:http://www.cnblogs.com/chengxiaohui/articles/2092001.html
View Details扩展下载地址:http://efbulkinsert.codeplex.com/ 注意同时安装依赖项目,不然会报错,还有,程序中有同一个dll的其他版本,那就可能一次安装不上,得一个一个安装依赖的dll Install-Package EntityFramework.MappingAPI -Version 6.0.0.7 Install-Package EntityFramework.BulkInsert-ef6 EntityFramework.BulkInsert插入数据和EF比较 初步猜测,它应该只是把多个sql合成一个,不管怎么优化,总该最后生成的是sql。 例如:20条数据,ef调试时看到的是一次连接,20次执行sql,这个批量,估计是一次连接,20个sql组合放到一个字符串提交,这样能减少时间。 再优化也不可能把sql给减少,同一sql在数据库中执行时间也不是EF能减少的。 实测(222数据库,表FinanceReceipts): 用Stopwatch监视执行时间(单位毫秒) 一次插入200条单据测试 EF插入耗时:11,086 BulkInsert插入耗时:740 一次插入10000条单据测试 EF插入耗时:510,640 BulkInsert插入耗时:3,200 通过看代码,和猜测的实现方式差不多,不过,代码中有表映射,为什么有这些功能? 因为 Insert 比数据库自带的 SqlBulkCopy 功能慢, EntityFramework.BulkInsert扩展在优化语句传输次数的同时,也采用了速度更快的 SqlBulkCopy 去将数据插入数据库,所以在插入大数据量时,比起EF本身的插入数据,可以说快得“离谱”。 不过,利用这个SqlBulkCopy快速插入数据,也就只能在插入上有改进,对于Update,Delete数据,速度上没有什么改进的 //批量插入测试代码 [csharp] view plain copy print? StringBuilder sb = new StringBuilder(); FinanceReceipts model = ReceiptsRepository.Entities.Include(o => o.FinanceReceiptDetail).Include(o => o.FinanceBillLog).First(o => o.ReceiptId == 214539); int createCount = 10000; model.ReceiptId = 0; model.ReceiptStatus = -1; model.ReceiptNo = ""; model.FinanceBillLog.OpenSafe().ToList().ForEach(m => m.ReceiptId = 0); model.FinanceReceiptDetail.OpenSafe().ToList().ForEach(m => m.ReceiptId = 0); model.ActualCreateTime = DateTime.Now; List<FinanceReceipts> entities = new List<FinanceReceipts>(); for (int i = 0; i < createCount; i++) { FinanceReceipts temp = model.DeepCopy(); model.ReceiptNo = "ef" + i; entities.Add(temp); } Stopwatch sw = new Stopwatch(); sw.Start(); ReceiptsRepository.Insert(entities); sw.Stop(); sb.AppendFormat("EF插入耗时:{0}\r\n", sw.ElapsedMilliseconds); model.ActualCreateTime = DateTime.Now; List<FinanceReceipts> entities2 = new List<FinanceReceipts>(); for (int i = 0; i < createCount; i++) { FinanceReceipts temp = model; model.ReceiptNo = "bi" + i; entities2.Add(temp); } sw.Restart(); var ctx = (this.UnitOfWork as UnitOfWorkContextBase).DbContext; using (var transactionScope = new TransactionScope()) { // some stuff in dbcontext ctx.BulkInsert(entities2); ctx.SaveChanges(); transactionScope.Complete(); } sw.Stop(); sb.AppendFormat("BulkInsert插入耗时:{0}\r\n", sw.ElapsedMilliseconds); string ret = sb.ToString(); 插入100条,每次插入一条,循环插入测试 第1次: EF插入耗时:9006 BulkInsert插入耗时:4173 第2次: EF插入耗时:8738 BulkInsert插入耗时:3806 第3次: EF插入耗时:8784 BulkInsert插入耗时:3727 BulkInsert还是比EF本身插入数据稍微快一点,总的来说: […]
View Details这边分享一下,提升ADO.Net Entity Framework执行速度的几个方法, 技巧一 取得单一数据时,可利用【GetObjectByKey】 在预设中,ObjectContext 在查询数据的时候,并不会以快取对象作为优先查询, 会在每次查询时都向数据库要数据,对效能会产生一定的影响, 因此可以利用【GetObjectByKey】方法来对快取对象进行查询, 但如果使用【GetObejctByKey】方法进行查询,而快取对象又不存在时, 会发生 ObjectNotFoundException 例外, 要避免此问题可利用【TryGetObejctByKey】方法, 如果在快取对象中找不到数据时,会回传 false,
1 2 3 4 5 6 7 8 9 10 |
////示范一 TryGetObjectByKey using (TestEntities te = new TestEntities()) { object entity; EntityKey key = new EntityKey("TestEntities.User", "User_id", 1); te.TryGetObjectByKey(key, out entity); ////使用 entity 对象 ////.... } |
技巧二 重复执行相同查询语法,可利用已编译查询【CompiledQuery】 在我们每次下达 Linq to Entities 向数据库查询数据时, 会先编译成 Entity SQL Language ,再经由 Provider 转换成对应该数据库的语法, 如果我们在循环里,对同一个查询下达1000次的话,就要经过1000次的转换, 这是很浪费效能的, 因此 ADO.Net Entity Framework 提供了 CompiledQuery 类别, 可以进行查询的编译和快取以供重复使用, 这边简单看一个范例
1 2 3 4 5 |
/// <summary> /// 已编译查询 /// </summary> private static readonly Func<TestEntities, int ,User> CompiledQueryGetUserById = CompiledQuery.Compile<TestEntities, int, User>((te, id) => te.User.Where(a=>a.User_id == id).FirstOrDefault()); |
1 2 3 4 5 6 |
////示范二 CompiledQuery using (TestEntities te = new TestEntities()) { //// 利用 CompiledQuery 取得数据 User u = CompiledQueryGetUserById.Invoke(te, 1); } |
技巧三 只进行查询,而不异动数据时 可利用【MergeOption.NoTracking】 使用【MergeOption.NoTracking】时, 因为不会再 ObjectStateManager 中追踪对象异动状态, 因此查询时效能较好,(系统默认是使用【MergeOption.AppendOnly】) 范例
1 2 3 4 5 |
////示范三 MergeOption.NoTracking using (TestEntities te = new TestEntities()) { User u = te.User.Execute(MergeOption.NoTracking).Where(a => a.User_id == 1).FirstOrDefault(); } |
参考连结 CompiledQuery 类别 已编译的查询 (LINQ to Entities) MergeOption 列举型别 ObjectStateManager ObjectContext..::.TryGetObjectByKey 方法 from:http://it.zhaozhao.info/archives/16465
View Details【摘要】 EF(Entity Framework)是一种ORM框架,它能把我们在编程时使用对象映射到底层的数据库结构。使用EF能较大地提升数据库应用的开发效率,与ADO.NET一样,EF在使用上也很灵活。但是同其他ORM框架一样,在批量更新和插入操作时,EF有很严重的性能问题,本文主要介绍使用ADO.NET中的批量插入功能来改善EF批量插入和更新的性能问题。 【正文】 一、插入功能 用EF原生的插入功能进行批量插入,使用SQL Server Profiler对数据库进行分析会发现,每一行数据都生成了一条insert语句,这样子插入的效率是很低的。 Profiler结果 而在ADO.NET中提供为SqlServer专门提供了SqlBulkCopy类用来处理大批量的数据插入问题,因此下面介绍一下在如何将其集成在我们的项目当中。 1、在代码中使用反射从EF获取对应的数据库字段,然后使用SqlBulkCopy映射后插入 2、如果连续三次插入失败,才认为此次操作失败 二、批量更新功能 用EF原生的功能进行批量操作的代码如下,使用SQL Server Profiler对数据库进行分析会发现和插入一样会为每一行数据都会生成一条Sql更新语句。 我们想要提高批量更新操作速度的思路就是先将数据批量插入到数据库当中,然后在数据库当中进行批量更新操作。 1、和批量插入一样,为了保证程序的健壮性,只有连续三次更新都失败时,才会认为更新失败 2、在代码中拼接sql语句,使用ADO.NET生成一个与待更新数据库结构一致的临时表,然后最后再拼接出更新用的语句,最后使用ADO.NET在数据库表之间做批量更新的操作。 使用100000条数据进行测试,使用原生的方法插入时,在两分钟内没有返回结果,修改后的方法只需要700ms。修改后的批量插入也能保证在1000ms内返回结果。 from:http://www.canway.net/Original/ruanjiankaifa/0120KR016.html
View Details最近网站里的参数包括中文的例如: http://www.chinapoesy.com/Tag%b0%ae%c7%e9.html 已开始使用 Server.UrlEncode来做的,但发现,有一些中文在url重写的是说找不到页面,URL的重写规范正则表达式是没有问题的啊。 后来GG了发现问题所在 Server.UrlEncode编码是使用系统默认的,而 System.Web.HttpUtility.UrlEncode 却可以指定编码。指定了编码为utf-8然后就好了。 System.Web.HttpUtility.UrlEncode("爱清",Encoding.UTF8) 这样以来就好了。 下面是转载的: 在对URL进行编码时,该用哪一个?这两都使用上有什么区别吗? 测试: string file="文件上(传)篇.doc"; string Server_UrlEncode=Server.UrlEncode(file); string Server_UrlDecode=Server.UrlDecode(Server_UrlEncode); string HttpUtility_UrlEncode=System.Web.HttpUtility.UrlEncode(file); string HttpUtility_UrlDecode=System.Web.HttpUtility.UrlDecode(HttpUtility_UrlEncode); Response.Write("原数据:"+file); SFun.WriteLine("Server.UrlEncode:"+Server_UrlEncode); SFun.WriteLine("Server.UrlDecode:"+Server_UrlDecode); SFun.WriteLine("HttpUtility.UrlEncode:"+HttpUtility_UrlEncode); SFun.WriteLine("HttpUtility.UrlDecode:"+HttpUtility_UrlDecode); 输出: 原数据:文件上(传)篇.doc Server.UrlEncode:%ce%c4%bc%fe%c9%cf%a3%a8%b4%ab%a3%a9%c6%aa.doc Server.UrlDecode:文件上(传)篇.doc HttpUtility.UrlEncode:%e6%96%87%e4%bb%b6%e4%b8%8a%ef%bc%88%e4%bc%a0%ef%bc%89%e7%af%87.doc HttpUtility.UrlDecode:文件上(传)篇.doc 区别在于:HttpUtility.UrlEncode()默认是以UTF8对URL进行编码,而Server.UrlEncode()则以默认的编码对URL进行编码。 在用 ASP.Net 开发页面的时候, 我们常常通过 System.Web.HttpUtility.UrlEncode 和 UrlDecode 在页面间通过 URL 传递参数. 成对的使用 Encode 和 Decode 是没有问题的. 但是, 我们在编写文件下载的页面的时候, 常常用如下方法来指定下载的文件的名称: Response.AddHeader("Content-Disposition","attachment; filename=" + HttpUtility.UrlEncode(fileName, Encoding.UTF8)); 之所以转换成 UTF8 是为了支持中文文件名. 这 时候问题就来了, 因为 HttpUtility.UrlEncode 在 Encode 的时候, 将空格转换成加号('+'), 在 Decode 的时候将加号转为空格, 但是浏览器是不能理解加号为空格的, 所以如果文件名包含了空格, 在浏览器下载得到的文件, 空格就变成了加号. 一个解决办法是, 在 HttpUtility 的 UrlEncode 之后, 将 "+" 替换成 "%20"( 如果原来是 "+" 则被转换成 "%2b" ) , 如: fileName = HttpUtility.UrlEncode(fileName, Encoding.UTF8); fileName = fileName.Replace("+", "%20"); 不明白微软为什么要把空格转换成加号而不是"%20". […]
View Details我总结了一下出现证书无法加载的原因有以下三个 1.证书密码不正确,微信证书密码就是商户号 解决办法:请检查证书密码是不是和商户号一致 2.IIS设置错误,未加载用户配置文件 解决办法:找到网站使用的应用程序池-->右击-->高级设置-->打开如下图-->在加载用户配置文件选择true 3.如果以上两个方案都不能解决问题,就有可能是加载证书时没有给定证书存储标识 解决方法:在加载证书方法时使用以下方法,请注意第三个参数 X509Certificate2 cer = new X509Certificate2(cerPath, password, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable); req.ClientCertificates.Add(cer); from:http://www.2cto.com/weixin/201602/489552.html
View Details
1 2 3 4 5 6 7 8 9 |
string txt = @"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIQAAAARCAMAAAArMfRlAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAACZFBMVEX////61s/+9vTxkn7wiHP5zsXtblX4yb/sZkv++Pftb1b4y8H74NrueGD+9/XyloTxjXn4y8LvhG7//v7+9fP619D2uKz86uf1saTtcVjsalDqXUDsak/qWz/98vD0qpvrYETvgGrvg23vgWvqWj3ud1/1r6H1sqT629T5z8frZEn3w7n++vrsbVT7497//v3vgWv50Mf4xrz2t6vqWz74ysH73dfrYUX2u6/3vrP1rZ/saU7ufWb1sKLsZ0zwinXvf2jtb1XrYkb1s6btcFf//PvueGHznYzsbVP4xbvynYvqXUHuemPvhW/97+z749785uHufGX85N/73df62NH50MjrX0P3wLTvgmz2ua362NHtcln61c7rX0L85uL51Mz//PzqXD/zoZH+9PL98e74ycDsbFLrYEX2t6rvgGnufGXtdVzudl72uq7ymYfxkn/wh3HzpJTrZkvvg27xlYLxkH3wiXX86ub85eH97ur98/HsaE7udl7rY0jsaE32uq73vLHymoj//f397er5zcTzn4797+3tcVj508vsa1L4yL72vLD0qpv+9/b3w7jwhnHrZEjuemL0qJn86OTzno32taj3vrL74dv739n739rqXkLsa1H+8/H3wrf73tj2tajrZUr4zMPue2Txk4D3wLXwjHj++ff0pZX50sr3wrf3wbbtc1v1saPzpJTtdV3wh3LwhXDzopL/+/ryl4X2tqn74dzvfmjxjnvueWL1r6H1s6Xxj3v86OT++vn4x7398O75zcT1tKf3v7T86eXwjHj0q5z0ppbwi3f97uv85ODtdFv4xLry8julAAAAAWJLR0QAiAUdSAAAA41JREFUSMfVlPtbTEEYx9+2Op1yqLRa02XjNCnataxuK2pbhYguIqRsRCKEdS1JS5RyTyQUIRa5leu63/1TZs6Zczbxk/U8Ht8f5jvv2dl5P+eddw7Afy8fzd/by9ePyVcK/TkyBPDyb4FBo0AYPUYOgkNU+ZAwdGyYd4m14zxzPlwnKZwkHo9QRCRCKCqaDHqAmAkTxVgcJ4riJLIwXiBKmCwIUxIBDMapXr69adp0D4RZdjP/SyVmJCUD6HHK8IX+qWRGINJC1B0sSPaZ6UaOm6WB2RERGenxoDpRJtaBxopQlm2O6iBk56gQ3FxJ86TEofO1EBaUaKDz3AUL8/z8FmErOavFFCKfVCJ8glBAIQoDRkIUYbk2S5KKAZbiqYqTR2nLCISkNOMwzyz5fSWWrwBYiUsJ1CoSleXq9eV4tV6vt9OFtCuiKkLWEIi1SZUjIdaxRirJouP6RMUBCqo2KBDJGcM8t1rZYuOmGkmbNpJg8xb71pm127Ra7fZQCrHD4diJdzkcjt2Mdk+ZfBwJNhLsLY1CaOI+S101l1G/1rx/EUINtYYDNXTbmkbFwV54UCdDNKX4WYe5M5pdsMCAQBoekhs20jra5ns4gbwlL0HUi2I1ziONKTZJEM1HdskQRxvo2bWEKZWw17Wa0+l2qdNXyMmPKQ5tR9oliOMnTp46XelxgGWs3c7gM/JZ2OedBZOzgy92QmIwg6A61+k5t/OlFtaYF7pMALrSFu5iXLd0HMgiQQB3aWQlLpclAIVw4g4tfaI40ZRxCkQLx10x9/RevdYO0HfdSZ7dqCqQIDiqiu10RDT1zVhBuR2Gsj3y/5sa+hlEch2Njbdut0i9cFzxxnSXKxtn3+nE7dI/FAfIqSj6qRIL716g0T2SbwDg/gOlEg8f4UgLq0SJP6m+v02+otcfs4341QyiPJpsuber+DyeTBoP5ytOV9FKCCy5oEIM2uwjjgNg1m71O2JiEP1xa+a2DT0pV65RPJflkCH668NA95TjevLaGQR0GBE6eRbgWV1VasNsj6sQ2eQTiHoVB3j+guV7iYvc7pxXvNvt5gc1MVsG6oOa4LXT2fMGKt8OOfIhqxF6azPfPQTeupWpi0BAbCt4KZPrKJsZBlwu14z3Q+SS7ghc/OFjMi3HJ1H83Az5o+gNuveODF/6NNCZoqqbPPr6TfvH6WV9P+Hta3ivblf5v0ZQ9QOnhO0Euy9VSAAAAABJRU5ErkJggg=="; var tmpArr = txt.Split(','); byte[] bytes = Convert.FromBase64String(tmpArr[1]); using (MemoryStream ms = new MemoryStream(bytes)) { ms.Write(bytes, 0, bytes.Length); var img = Image.FromStream(ms, true); img.Save("demo.png"); } |
摘自:http://www.itnose.net/detail/6387947.html
View Detailsasp.net抓网页源代码的代码很普遍,大家都会用,不过今天我在使用asp.net抓网页源代码时,遇到了一个小小的困扰,那就是我在请求header里添加了GZip的内容编码后,一直返回乱码的问题。不过最终还是把这个小问题给解决了,现在记录一下。 asp.net使用gzip抓取网页 普遍情况下,asp.net抓取网页源码时并不使用gzip,而是直接抓。关键代码如下: string PageUrl = "http://www.webkaka.com/"; WebRequest request = WebRequest.Create(PageUrl); WebResponse response = request.GetResponse(); Stream resStream = response.GetResponseStream(); Encoding enc = Encoding.GetEncoding("GB2312"); StreamReader sr = new StreamReader(resStream, enc); string strHtml = sr.ReadToEnd(); resStream.Close(); sr.Close(); 在请求header里添加了GZip的内容编码: string PageUrl = "http://www.webkaka.com/"; WebRequest request = WebRequest.Create(PageUrl); request.Headers.Add("Accept-Encoding", "gzip,deflate"); WebResponse response = request.GetResponse(); Stream resStream = response.GetResponseStream(); Encoding enc = Encoding.GetEncoding("GB2312"); StreamReader sr = new StreamReader(resStream, enc); string strHtml = sr.ReadToEnd(); resStream.Close(); sr.Close(); 但是,这样的代码,获得的网页源代码是乱码的,确切来说,是经过了GZip压缩的字符串,因此必须要进一步处理,把这些乱码还原成可读的html代码。 最终实现代码如下: string PageUrl = "http://www.webkaka.com/"; WebRequest request = WebRequest.Create(PageUrl); request.Headers.Add("Accept-Encoding", "gzip,deflate"); request.AutomaticDecompression = DecompressionMethods.GZip; WebResponse response = […]
View Details