查找数据库中的流数据,然后读取流文件,导出的word会报错,但是还是能打开

时间:2021-07-01 17:02:25
代码这样的
 

SqlConnection conn = new SqlConnection();

                conn.ConnectionString = @"Data Source=WIN-9BHO8FF7NNT\QFSQLSERVER;Initial Catalog=SnakeIsland;User ID=sa;Password=123456";

                SqlCommand cmd = new SqlCommand();

                cmd.Connection = conn;
                cmd.CommandText = "select FileObject from tb_urgentFile where Name='" + name + "'";
                //m_flie_cOper = new UrgentFilesOper();
                //tb_urgentFile urgfile=m_flie_cOper.Query(name);

                FileStream fs;
                BinaryWriter bw;
                //设定允许读取到缓冲区的最大长度
                int buffersize = 100000;
                //要将字节流读入的缓冲区
                byte[] outbyte = new byte[buffersize];
                //用于记录已经读取的字节数
                long reval;
                //字段中的索引,从这里开始读取操作
                long startIndex;
                //FileStream对象将封装的文件的相对路径或绝对路径 

                SaveFileDialog saveFile = new SaveFileDialog() { Filter = "Word文档(*.docx)|*.docx|Word2003文档(*.doc)|*.doc" };
                saveFile.Title = "导出文件路径";
                saveFile.FilterIndex = 1;
                saveFile.ShowDialog();
                if (saveFile.FileName == "" || saveFile.FileName == null)
                {
                    MessageBox.Show("文件名不能为空!");
                    return;
                }
                string filePath = saveFile.FileName; 


                conn.Open();
                SqlDataReader reader;
                
                
                reader = cmd.ExecuteReader();

                while (reader.Read())
                {

                    fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write);

                    bw = new BinaryWriter(fs);
                    startIndex = 0;
                    //将字节流读入outbyte缓冲区中并返回读取的字节数
                    reval = reader.GetBytes(0, startIndex, outbyte, 0, buffersize);
                    //当读取的字节流达到缓冲区允许的最大长度时要卸载缓冲区内的数据并将数据写入文件
                    while (reval == buffersize)
                    {
                        bw.Write(outbyte);
                        bw.Flush();
                        //重新设定开始读取的位置,并继续读取和写数据
                        startIndex += buffersize;

                        reval = reader.GetBytes(0, startIndex, outbyte, 0, buffersize);

                    }

                    //将缓冲区内最后剩余的数据写入文件

                    bw.Write(outbyte, 0, (int)reval - 1);
                    
                    
                    bw.Flush();

                    bw.Close();

                    fs.Close();

                  }
                  if (reader.Read().ToString() != "")
                    {
                        WPFMessageBox.MessageBox.ShowWarning("读取成功!" );
                    }
                 else
                    {
                        WPFMessageBox.MessageBox.ShowWarning("读取失败");
                    }
                 reader.Close();
                 conn.Close();
 


能导出word,但是打开会有报错:“无法打开office open xml文件 因为内容有错误”,然后“Word在文件中发现无法读取的内容,是否恢复此文档的内容?如果信任来源就点击是”,然后才能打开。这是什么问题? 查找数据库中的流数据,然后读取流文件,导出的word会报错,但是还是能打开查找数据库中的流数据,然后读取流文件,导出的word会报错,但是还是能打开

2 个解决方案

#1


引用 楼主 Jazzai 的回复:
bw.Write(outbyte, 0, (int)reval - 1);

不是很明白为啥要-1

#2


引用 1 楼 shingoscar 的回复:
Quote: 引用 楼主 Jazzai 的回复:
bw.Write(outbyte, 0, (int)reval - 1);

不是很明白为啥要-1


大神好厉害  一眼就看出来了。我把-1删掉就没文艺了

#1


引用 楼主 Jazzai 的回复:
bw.Write(outbyte, 0, (int)reval - 1);

不是很明白为啥要-1

#2


引用 1 楼 shingoscar 的回复:
Quote: 引用 楼主 Jazzai 的回复:
bw.Write(outbyte, 0, (int)reval - 1);

不是很明白为啥要-1


大神好厉害  一眼就看出来了。我把-1删掉就没文艺了