最近做一个项目,有一个需求是这样的:服务端从数据库里获得数据,客户端保存为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. 洛谷 P3919 【模板】可持久化数组(可持久化线段树/平衡树)-可持久化线段树(单点更新,单点查询)

    P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目背景 UPDATE : 最后一个点时间空间已经放大 标题即题意 有了可持久化数组,便可以实现很多衍生的可持久化功能(例如:可持久化并查集 ...

  2. 【转载】SwipeRefreshLayout源码解析

    原文地址:https://github.com/hanks-zyh/SwipeRefreshLayout/blob/master/README.md 官方文档 SwipeRefreshLayout 是 ...

  3. Java 中自定义时间格式

    DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); Date d = new Date(); String s ...

  4. 【SQL】ORACLE生成临时表

    在日常的SQL查询中,我们需要对要查询的数据进行事先处理,然后再在预先处理好的数据里面进行查询.此时我们就需要用到临时表了,将数据预先处理好放到临时表里面,然后再在临时表里根据我们需要的条件进行查询. ...

  5. HDU 6336 Matrix from Arrays

    Problem E. Matrix from Arrays Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 ...

  6. Visual Studio警告IDE0006的解决办法

     Visual Studio警告IDE0006的解决办法 Visual Studio警告IDE0006虽然给出明确的操作过程,但是在实施的过程中,还是有很多地方需要注意.下面以官方的信息,介绍一下注意 ...

  7. (hdu1007)Quoit Design,求最近点对

    Problem Description Have you ever played quoit in a playground? Quoit is a game in which flat rings ...

  8. 关于SOA

    什么是SOA SOA:面向服务的体系结构(Service-Oriented Architecture,SOA,也叫面向服务架构), SOA是指为了解决在Internet环境下业务集成的需要,通过连接能 ...

  9. hdu 1864 最大报销额(背包)

    最大报销额 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  10. [COCI2011-2012#7] KAMPANJA

    这个题似曾相识啊,以前是用搜索剪枝+0/1边权bfs做的(题面可以参照上一篇这个题的博客). 有一类问题就是求 包含若干关键点的最小强联通子图大小是多少. 如果关键点数量是变量,那么就是NP问题了.. ...