最近做一个项目,有一个需求是这样的:服务端从数据库里获得数据,客户端保存为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. org.xml.sax.SAXParseException; lineNumber: 14; columnNumber: 32; 元素类型为 "key" 的内容必须匹配 "(column)*"

    报错:部分错误信息,主要查看CauseBy Caused by: org.hibernate.InvalidMappingException: Unable to read XML at org.hi ...

  2. Flask实战第56天:板块管理

    cms布局 编辑 cms_boards.html {% block main_content %} <div class="top-box"> <button c ...

  3. ProxyStrike运行bug解决办法

     ProxyStrike运行bug解决办法 由于curl中参数CURLOPT_SSL_VERIFYHOST的值取消原有的值1,导致ProxyStrike无法正常运行.所以,要运行该工具,需要手动修改/ ...

  4. bzoj 4017: 小Q的无敌异或

    4017: 小Q的无敌异或 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 593  Solved: 197[Submit][Status][Discu ...

  5. 【BFS】Power Hungry Cows

    Power Hungry Cows Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 5522   Accepted: 1384 ...

  6. bzoj 1236: longpo的回文

    1236: longpo的回文 题目描述 一个字符串如果从左到右和从右到左读的结果是一样的,我们称之为回文串.现在给定一个字符串,我们有三种操作: 1.     添加一个字母在任何位置(可以在首尾添加 ...

  7. Linux 内核中的 GCC 特性

    https://www.ibm.com/developerworks/cn/linux/l-gcc-hacks/ GCC 和 Linux 是出色的组合.尽管它们是独立的软件,但是 Linux 完全依靠 ...

  8. Java并发包之闭锁/栅栏/信号量

    二.同步工具类详解 1.Semaphore信号量:跟锁机制存在一定的相似性,semaphore也是一种锁机制,所不同的是,reentrantLock是只允许一个线程获得锁,而信号量持有多个许可(per ...

  9. BlackBerry10 开发环境搭建

    最近开始学习BlackBerry10的开发,黑莓10系统是2013年1月30日黑莓公司正式发布的,目前网上资料比较少,这篇博客的内容基本上是按照官网上的文档写的.BlackBerry10目前支持C/C ...

  10. Objective-C]入门 (xcode helloworld程序 创建类

    一:objective-c简介 Objective-C是进行iPhone软件开发的语言 Objective-C语言是C语言的一个扩展集 Objective-C是一种面向对象的语言 大小写敏感 程序语句 ...