无法上传的问题
使用spread for silverlight,在网页中部署,现在的问题是:1、客户要求生成的excel报表能够批量下载,所有只有在发布报表的时候,生成excel文件,并上传到服务器
2、处理流程:
(1)从服务器上下载Excel报表模板
(2)读取数据库使用Spread往Excel中填充数据
(3)用户点击确定按钮,使用SaveExcel方法保存流,并将数据上传到服务器
3、问题:
(1)无法上传
提示:无法访问已释放的对象。
对象名:“MS.Internal.InternalMemoryStream”。
(2)silverlight的上传机制是否必须要求用户点击filedialog从本地选取文件进行上传?上述上传方式是否是silverlight安全机制所禁止的?
(3)你们有没有好的解决方法? 回复 1楼socamp的帖子
(1)无法上传
请问在保存之前是否已经把这个流关闭了?因为spread在saveexcel时是不会关闭流文件的。
(2)silverlight的上传机制是否必须要求用户点击filedialog从本地选取文件进行上传?
是 Silverlight 的安全机制,你的理解是对的,Silverlight 应用有关客户端文件的操作都必须通过 OpenFileDialog 和 SaveFileDialog 操作。 那目前你们有没有好的解决方法呢?能否获取到spread的byte[]数据,如果能获取的话,我可以将其转成0~F的字符串Post到服务器,然后在服务器上遍历字符串将其转成文件。 回复 3楼socamp的帖子
可以首先使用以下方法保存成 Stream,
gcSpreadSheet1.SaveExcel(stream, GrapeCity.Windows.SpreadSheet.Data.ExcelFileFormat.XLSX);
然后把 Stream 转换byte,提供给链接供您参考,希望对您有帮助:
http://msdn.microsoft.com/en-us/library/dhx0d524(v=vs.110).aspx gcSpreadSheet1.SaveExcel这个方法还是需要通过文件对话框获取stream,有没有其他创建stream的方法? 问题解决,用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;
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());
}
}
谢谢版主。。 少了一句,在第三行
webClient.OpenWriteAsync(path, "POST", ms ); 错,在第四行:L 回复 8楼socamp的帖子
好的,感谢您反馈问题结果。
页:
[1]