最近做一个项目,有一个需求是这样的:服务端从数据库里获得数据,客户端保存为Excel文件  

最初解决方案:服务端获得数据,通过ExcelPackage,Convert.ToBase64String将byte转化成string方式传输给客户端,客户端通过Convert.FromBase64String(excelData)将string转换为byte写入Excel文件,代码如下:

服务端:

public string GetExcelDataString(string connectionString, string sql)
{
MemoryStream s = new MemoryStream();
using (ExcelPackage pck = new ExcelPackage())
{
DataTable table = GetTableBySql(connectionString, sql);
table.TableName = "ExprotData";
ExcelWorksheet ws = pck.Workbook.Worksheets.Add(table.TableName);
ws.Cells["A1"].LoadFromDataTable(table, true);
pck.SaveAs(s);
}
return Convert.ToBase64String(s.ToArray());
}

客户端:

using (Stream fs = (Stream)SaveFileDialog.OpenFile())
{
byte[] fileBytes = Convert.FromBase64String(excelDataString);
fs.Write(fileBytes, , fileBytes.Length);
fs.Close();
}

这样可以实现上面需求,但是存在一个问题:在数据量特别大的时候占用内存较大,还有一个问题是,时间字段传输过来保存后是一个五位的数字串,得不到时间,这样就需要进行优化。
注意:silverlight保存文件时,不允许通过打开制定路径方式保存,必须通过SaveFileDialog类来实现;

新的解决方案如下:服务端将datatable转换为string,客户端解析string,并写入excel文件

服务端:

public string GetExcelAsString(string connectionString, string sql)
{
MemoryStream s = new MemoryStream();
DataTable table = GetTableBySql(connectionString, sql);
var result = DataTableToCsv(table);
return result;
}
public string DataTableToCsv(DataTable table)
{
var result = new StringBuilder();
for (int i = ; i < table.Columns.Count; i++)
{
result.Append(table.Columns[i].ColumnName);
result.Append(i == table.Columns.Count - ? "\n" : ",");
}
foreach (DataRow row in table.Rows)
{
for (int i = ; i < table.Columns.Count; i++)
{
result.Append("\"" + row[i].ToString().Replace("\"", "\"\"") + "\"");
result.Append(i == table.Columns.Count - ? "\n" : ",");
}
}
return result.ToString();
}

客户端:

using (Stream fs = (Stream)SaveFileDialog.OpenFile())
{
StreamWriter sw = new StreamWriter(fs, Encoding.UTF8);
sw.WriteLine(excelData);
sw.Flush();
sw.Close();
fs.Close();
}

这样就可以解决传输数据量过大和写入文件乱码问题。
总结:受第一种解决方案的影响,在优化时一直想着把string转换为bytes,然后在通过fs.Write(fileBytes, 0, fileBytes.Length)写入文件,这样就有一个问题,无论怎么转换,最终写入文件的中文字符都是乱码,尝试一个下午依然无法实现。最后查找一些其他资料,发现这个问题饶了一个大的圈子,最后通过方案二解决。大家在做事情时一定不要受思维定式影响,有时其实解决方案很简单,不要想得那么复杂。

silverlight不支持ASCIIEncoding.GetEncoding("GB2312").GetBytes(stringData)这种方式转换,没有ASCIIEncoding的解码方式;

silverlight通过byte[] fileBytes = UTF8Encoding.UTF8.GetBytes(stringData);转换后写入文件,依然乱码,但是不转换为bytes,直接用StreamWriter的UTF8问题解决;

silverlight客户端保存文件乱码问题的更多相关文章

  1. GitHub Desktop客户端打开文件乱码问题解决方案

    今天在使用GitHub Desktop客户端的时候,发添加本地仓库后文件内容显示为乱码. 1.现象  如下图所示: 2.原因分析 后来分析得知原来是由于编码不统一造成 的. 具体来说,我在window ...

  2. silverlight打开和保存文件

    因为Silverlight是运行在浏览器中的客户端,所以对于程序的操作权限要求比较严格,以本篇的主题来说,一个表现就是不能够随意的进行文件打开和保存操作,如果在代码中直接使用Stream来操作文件,会 ...

  3. 你得学会并且学得会的Socket编程基础知识(续)——Silverlight客户端

    本文将在这个案例的基础上,加入一个特殊场景,利用Silverlight来实现客户端.有的朋友可能会说,其实是一样的吧.请不要急于下结论,有用过Silverlight的朋友都有这种体会,很多在标准.NE ...

  4. mysql保存中文乱码的原因和解决办法

    当你遇到这个mysql保存中文乱码问题的时候,期待找到mysql保存中文乱码的原因和解决办法这样一篇能解决问题的文章是多么激动人心.    也许30%的程序员会选择自己百度,结果发现网友已经贴了很多类 ...

  5. 从XML文件乱码问题,探寻其背后的原理

    出现应用程序读取XML文件乱码的场景: 加入xml文件以<?xml version="1.0" encoding="utf-8" ?> 格式的:如果 ...

  6. Silverlight客户端调用WCF服务难题解疑

    一:解决办法 Silverlight客户端调用WCF服务在实际使用中经常会出现的问题就是无法直接应用类文件和配置文件.微软针对这一情况已经给出了解决办法.WCF开发框架可以帮助我们实现可靠性较高的跨平 ...

  7. 从XML文件乱码问题,探寻其背后的原理(转)

    由于网友反应本文图片不能显示,由于时间关系未能及时修正.请访问原文地址: 本文出自http://blog.csdn.net/dinglang_2009/article/details/6895355, ...

  8. ArcGIS网络分析之Silverlight客户端路径分析(三)

    原文:ArcGIS网络分析之Silverlight客户端路径分析(三) 首先贴上最终的效果图: a.路径查询 2.最近设施点查询 3.服务区分析 说明: 1.以上的示例使用的数据是随意在ArcMap中 ...

  9. 使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置)

    原文:使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置) 在上一篇中说到了Silverlight下的Socket通信,在最后的时候说到本篇将会结合地图. ...

随机推荐

  1. 经典算法-最长公共子序列(LCS)与最长公共子串(DP)

    public static int lcs(String str1, String str2) { int len1 = str1.length(); int len2 = str2.length() ...

  2. Office 2016系列下载地址

    版本:Office 2016 Pro Plus 64位文件名:SW_DVD5_Office_Professional_Plus_2016_64Bit_ChnSimp_MLF_X20-42426.ISO ...

  3. Poj2482 Stars in Your Window(扫描线)

    题面 Poj 题解 下面内容引用自"李煜东 <算法竞赛进阶指南>"(对原文略有缩减,侵删): 因为矩形的大小固定,所以矩形可以由它的任意一个顶点唯一确定.我们可以考虑把 ...

  4. Codeforces Testing Round 14

    A:The Way to Home link:http://codeforces.com/contest/910/problem/A 题面:有每次最大跳跃距离d,只有一部分的点可以落脚,求最少几步达到 ...

  5. qsc round#2 喵哈哈村的排队(本辣鸡想七想八的,特写此博文给自己一个提醒)

    该oj是qsc自己写的比赛,友情链接:http://qscoj.cn/ 喵哈哈村的排队 发布时间: 2017年2月26日 16:13   最后更新: 2017年2月26日 16:14   时间限制: ...

  6. Excel | 如何用Excel实现证件照底色调换

    这段时间因为一些事情需要用到证件照这个东西,大家应该都清楚,不管是简历还是各种考试上面,都需要贴上一张规规矩矩的证件照片或是上传电子照片. 通常,我们到照相馆照证件照的时候,无外乎红底.蓝底以及白底这 ...

  7. 使用create-react-app时的something is already running on port 3000

    问题: 自己今天在使用create-react-app搭建react应用的时候,开启了两个React app,然后npm start的时候,出现something is already running ...

  8. moment.js 日期包装类 (说明示例)

    moment.js 日期包装类 Moment.js 1创建时间对象 moment();                                                          ...

  9. 陈立伟 - MultiCharts快易通(2013年8月2日)

    <MultiCharts快易通> 作 者:陈立伟 译 者: 系 列:寰宇程式交易312--挑战程式交易系列1 出 版:寰宇出版股份有限公司 字 数:千字 阅读完成:2013年8月2日

  10. 简单理解SNAT回流中的概念:路由器怎么知道外网返回的数据是局域网中哪台主机的

    内网到外网用的是NAT技术(地址封装)外网到内网用的是端口映射(PNAT)计算机的端口又65535(0-65534),你说的那些有名气的端口大多都是0-1023之间的你说的这个问题很简单,但首先你要懂 ...