找回密码
 立即注册

QQ登录

只需一步,快速开始

socamp

论坛元老

4

主题

19

帖子

4608

积分

论坛元老

积分
4608

活字格认证

最新发帖

[已处理] 无法上传的问题

socamp
论坛元老   /  发表于:2014-8-27 01:31  /   查看:7240  /  回复:8
使用spread for silverlight,在网页中部署,现在的问题是:
1、客户要求生成的excel报表能够批量下载,所有只有在发布报表的时候,生成excel文件,并上传到服务器
2、处理流程:
     (1)从服务器上下载Excel报表模板
     (2)读取数据库使用Spread往Excel中填充数据
    (3)用户点击确定按钮,使用SaveExcel方法保存流,并将数据上传到服务器
3、问题:
     (1)无法上传
     提示:无法访问已释放的对象。
     对象名:“MS.Internal.InternalMemoryStream”。
     (2)silverlight的上传机制是否必须要求用户点击filedialog从本地选取文件进行上传?上述上传方式是否是silverlight安全机制所禁止的?
     (3)你们有没有好的解决方法?

8 个回复

倒序浏览
iceman
社区贡献组   /  发表于:2014-8-27 10:47:00
沙发
回复 1楼socamp的帖子

(1)无法上传
请问在保存之前是否已经把这个流关闭了?因为spread在saveexcel时是不会关闭流文件的。

(2)silverlight的上传机制是否必须要求用户点击filedialog从本地选取文件进行上传?
是 Silverlight 的安全机制,你的理解是对的,Silverlight 应用有关客户端文件的操作都必须通过 OpenFileDialog 和 SaveFileDialog 操作。
回复 使用道具 举报
socamp
论坛元老   /  发表于:2014-8-27 11:12:00
板凳
那目前你们有没有好的解决方法呢?能否获取到spread的byte[]数据,如果能获取的话,我可以将其转成0~F的字符串Post到服务器,然后在服务器上遍历字符串将其转成文件。
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2014-8-27 18:49:00
地板
回复 3楼socamp的帖子

可以首先使用以下方法保存成 Stream,

  1. gcSpreadSheet1.SaveExcel(stream, GrapeCity.Windows.SpreadSheet.Data.ExcelFileFormat.XLSX);
复制代码


然后把 Stream 转换byte,提供给链接供您参考,希望对您有帮助:
http://msdn.microsoft.com/en-us/library/dhx0d524(v=vs.110).aspx
回复 使用道具 举报
socamp
论坛元老   /  发表于:2014-8-28 10:34:00
5#
gcSpreadSheet1.SaveExcel这个方法还是需要通过文件对话框获取stream,有没有其他创建stream的方法?
回复 使用道具 举报
socamp
论坛元老   /  发表于:2014-8-28 11:27:00
6#
问题解决,用MemoryStream代替Stream进行上传即可,没有想得那么麻烦。代码如下(项目中拷贝过来简化后的代码,不保证能直接执行):
MemoryStream ms = new MemoryStream();
gcSpreadSheet1.SaveExcel(ms, ExcelFileFormat.XLSX);
WebClient webClient = new WebClient();
webClient.OpenWriteCompleted += (r,args) =>{
try
                {
                    Stream stream = args.Result;
                    byte[] buffer = new byte[4096];
                    int readcount = 0;
                    fileStream.Position = 0;
                    //将需要上传的流读取到指定的字节数组中
                    while ((readcount = fileStream.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        //将指定的字节数组写入到目标地址的流
                        stream.Write(buffer, 0, readcount);
                    }
                    fileStream.Close();
                    stream.Close();

                    if (DoActionCompleted != null)
                        DoActionCompleted();
                }
                catch (Exception ee)
                {
                    //throw new Exception(ee.Message.ToString());
                }
}

谢谢版主。。
回复 使用道具 举报
socamp
论坛元老   /  发表于:2014-8-28 11:28:00
7#
少了一句,在第三行
webClient.OpenWriteAsync(path, &quotOST", ms );
回复 使用道具 举报
socamp
论坛元老   /  发表于:2014-8-28 11:37:00
8#
错,在第四行
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2014-8-28 16:09:00
9#
回复 8楼socamp的帖子

好的,感谢您反馈问题结果。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部