none
FpSpread.OpenExcel 方法 (Stream),无法从内存流打开文件? RRS feed

  • 问题

  • 1、有一个xls文件存储在ACCESS数据库的ole字段“结算单存储路径”中
    2、首先我尝试从文件流打开文件:
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
      '打开数据库连接
      Dim tempConnection As New OleDb.OleDbConnection
      tempConnection.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:\Backup\我的文档\Visual Studio 2008\Projects\文件读写测试\结算计价信息系统.mdb"
      tempConnection.Open()
      Dim readimg As New OleDb.OleDbCommand("SELECT 结算单台账.结算单存储路径, 结算单台账.ID FROM 结算单台账 where 结算单台账.ID=109", tempConnection)
      Dim rs As OleDbDataReader = readimg.ExecuteReader()
      Dim xlsbyte() As Byte
      While rs.Read
      xlsbyte = rs("结算单存储路径")
      MsgBox(rs("ID").ToString)
      End While
      Dim f As String
      f = "C:\Documents and Settings\Administrator\桌面\19.xls"
      Dim s As New System.IO.FileStream(f, IO.FileMode.Create, IO.FileAccess.ReadWrite)
      s.Write(xlsbyte, 0, xlsbyte.Length)
      s.Close()
      Dim opf As New System.IO.FileStream(f, IO.FileMode.Open, IO.FileAccess.ReadWrite)
      Try
      FpSpread1.OpenExcel(opf)'结果:可以成功打开文件。
      Catch ex As Exception
      MessageBox.Show(ex.Message)
      End Try
      End Sub
    [b]2、我改用从内存流来打开xls,我失败了,请教有什么办法可以解决?[/b]
    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
      '打开数据库连接
      Dim tempConnection As New OleDb.OleDbConnection
      tempConnection.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:\Backup\我的文档\Visual Studio 2008\Projects\文件读写测试\结算计价信息系统.mdb"
      tempConnection.Open()
      Dim readimg As New OleDb.OleDbCommand("SELECT 结算单台账.结算单存储路径, 结算单台账.ID FROM 结算单台账 where 结算单台账.ID=109", tempConnection)
      Dim rs As OleDbDataReader = readimg.ExecuteReader()
      Dim xlsbyte() As Byte
      While rs.Read
      xlsbyte = rs("结算单存储路径")
      MsgBox(rs("ID").ToString)
      End While
      Dim xlsmemory As New MemoryStream()
      Try
      xlsmemory.Write(xlsbyte, 0, xlsbyte.Length)
      FpSpread1.Open(xlsmemory)’无法打开文件,请问怎么解决?[b][/b]
      Catch ex As Exception
      MessageBox.Show(ex.Message)
      End Try
      End Sub
    2012年1月27日 11:10

答案

  • 请这样做:

    byte[] bytes = System.IO.File.ReadAllBytes("c:\\try.xls");

    MemoryStream ms = new MemoryStream(bytes);

    FpSpread.OpenExcel(ms);


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    • 已标记为答案 firedream 2012年2月2日 8:44
    2012年1月31日 4:49
    版主
  • 非常谢谢问题已解决

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
            Dim fileName As String
            fileName = "D:\Backup\我的文档\Visual Studio 2008\Projects\文件读写测试\文件读写测试\2010年后开工项目统计.xls"
            '读入文件数据
            Dim fs = New FileStream(fileName, IO.FileMode.Open, IO.FileAccess.Read)
            Dim xlsData(fs.Length - 1) As Byte
            fs.Read(xlsData, 0, fs.Length - 1)
            fs.Close()
            Dim tempConnection As New OleDb.OleDbConnection
            '打开数据库连接
            tempConnection.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:\Backup\我的文档\Visual Studio 2008\Projects\文件读写测试\结算计价信息系统.mdb"
            tempConnection.Open()
            Dim cmd1 As New OleDb.OleDbCommand("INSERT INTO 结算单台账(结算单存储路径) VALUES(@Name)", tempConnection)
            cmd1.Parameters.Add("@Name", OleDbType.Binary)
            cmd1.Parameters("@Name").Value = xlsData
            cmd1.ExecuteNonQuery()
            '读数据库
            Dim readimg As New OleDb.OleDbCommand("SELECT 结算单台账.结算单存储路径, 结算单台账.ID FROM 结算单台账 where 结算单台账.ID=109", tempConnection)
            Dim rs As OleDbDataReader = readimg.ExecuteReader()
            Dim xlsbyte As Byte()
            While rs.Read
                xlsbyte = rs("结算单存储路径")
            End While
            Try
                '控件读入内存流
                Dim xlsmemory As New MemoryStream(xlsbyte)
                FpSpread1.OpenExcel(xlsmemory)
            Catch ex As Exception
                'MessageBox.Show(ex.Message)
            End Try
        End Sub
    


    • 已标记为答案 firedream 2012年2月2日 8:44
    2012年2月2日 8:44

全部回复

  • xlsmemory.Write(xlsbyte, 0, xlsbyte.Length)
    xlsmemory.Flush() '全部写入 xlsmemory.Position=0 '加入这句话,防止指针指向最后一个位置 FpSpread1.Open(xlsmemory)

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年1月28日 5:28
    版主
  • 新年好,祝您龙年身体健康,工作蒸蒸日上。
    1、我按您的方法测试了程序之后,得到以上图片上的消息,我不知如何处理,烦您指教,谢谢。
    2、如果不加您的那两句代码
    xlsmemory.Flush()               '取消此语句
    xlsmemory.Position=0          '取消此语句
    得到的提示是“缺少根元素。

    3、FpSpread.OpenExcel 方法 (Stream)

     参数 说明 stream 表示指定的 Excel 文件流。

    4、我现在要从内存流在控件中显示表格,那么可能需要将内存流转换成文件流。是不是必须将内存流内容创建为文件然后打开文件创建文件流才能成功呢?

    • 已编辑 firedream 2012年1月29日 6:44 未取得成功
    2012年1月29日 6:34
  • 如果参数提示需要一个Stream,那么MemoryStream应该是可以的;看的错误是“编码无效……”,估计读取编码出问题了。请点击我签名档的给我写信,信中附带项目以及该论坛的url,以便我有空给你看看回复。

    谢谢!祝愿你龙年大吉!


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2012年1月29日 8:32
    版主
  • 谢谢,我以向您递交了电子邮件,望您赐教。
    2012年1月29日 9:09
  • 谢谢,我以向您递交了电子邮件,望您赐教。

    对不起,我这里缺少一些必要的类库,无法运行;要不请你把类库安装程序连同项目一起打包过来,谢谢!


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2012年1月30日 1:19
    版主
  • 好的,谢谢,请进一步指教。
    2012年1月30日 5:26
  • 好的,谢谢,请进一步指教。

    如果加载整个Excel,不要读取,直接尝试这样做:

    byte[] bytes = System.IO.File.ReadAllBytes("c:\\try.xls");

    MemoryStream ms = new MemoryStream();

    ms.Write(bytes,0,bytes.Length);

    ms.Flush();

    FpSpread.OpenExcel(ms);


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2012年1月31日 1:55
    版主
  • 谢谢,但仍有问题。
    2012年1月31日 3:30
  • 请这样做:

    byte[] bytes = System.IO.File.ReadAllBytes("c:\\try.xls");

    MemoryStream ms = new MemoryStream(bytes);

    FpSpread.OpenExcel(ms);


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    • 已标记为答案 firedream 2012年2月2日 8:44
    2012年1月31日 4:49
    版主
  • 非常谢谢问题已解决

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
            Dim fileName As String
            fileName = "D:\Backup\我的文档\Visual Studio 2008\Projects\文件读写测试\文件读写测试\2010年后开工项目统计.xls"
            '读入文件数据
            Dim fs = New FileStream(fileName, IO.FileMode.Open, IO.FileAccess.Read)
            Dim xlsData(fs.Length - 1) As Byte
            fs.Read(xlsData, 0, fs.Length - 1)
            fs.Close()
            Dim tempConnection As New OleDb.OleDbConnection
            '打开数据库连接
            tempConnection.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:\Backup\我的文档\Visual Studio 2008\Projects\文件读写测试\结算计价信息系统.mdb"
            tempConnection.Open()
            Dim cmd1 As New OleDb.OleDbCommand("INSERT INTO 结算单台账(结算单存储路径) VALUES(@Name)", tempConnection)
            cmd1.Parameters.Add("@Name", OleDbType.Binary)
            cmd1.Parameters("@Name").Value = xlsData
            cmd1.ExecuteNonQuery()
            '读数据库
            Dim readimg As New OleDb.OleDbCommand("SELECT 结算单台账.结算单存储路径, 结算单台账.ID FROM 结算单台账 where 结算单台账.ID=109", tempConnection)
            Dim rs As OleDbDataReader = readimg.ExecuteReader()
            Dim xlsbyte As Byte()
            While rs.Read
                xlsbyte = rs("结算单存储路径")
            End While
            Try
                '控件读入内存流
                Dim xlsmemory As New MemoryStream(xlsbyte)
                FpSpread1.OpenExcel(xlsmemory)
            Catch ex As Exception
                'MessageBox.Show(ex.Message)
            End Try
        End Sub
    


    • 已标记为答案 firedream 2012年2月2日 8:44
    2012年2月2日 8:44