将Excel字节数组数据转换为Datatable C#API

将Excel字节数组数据转换为Datatable C#API,c#,.net,C#,.net,要求客户端以字节数组的形式发送Excel数据(将为客户端提供相同的API链接) 现在,当API接收到字节数组时,我想将其转换为datatable以转换为XML 下面是我尝试过的代码 public string ConvertExcelByteArraytoXML() { byte[] Excelbytes = null; FileStream fs = File.OpenRead("C:\\PRATAP FOLDER\\test

要求客户端以字节数组的形式发送Excel数据(将为客户端提供相同的API链接)

现在,当API接收到字节数组时,我想将其转换为datatable以转换为XML

下面是我尝试过的代码

 public string ConvertExcelByteArraytoXML()
        {

            byte[] Excelbytes = null;
            FileStream fs = File.OpenRead("C:\\PRATAP FOLDER\\test.xlsx");            
            BinaryReader binaryReader = new BinaryReader(fs);
            Excelbytes = binaryReader.ReadBytes((int)fs.Length);
            string CreateXMLFILE = string.Empty;

       // the above code was to get byte array from excel 

            DataSet tempDataSet = new DataSet();
            DataTable dt;
            // Deserializing into datatable    
            using (MemoryStream stream = new MemoryStream(Excelbytes))
            {
                BinaryFormatter bformatter = new BinaryFormatter();
                dt = (DataTable)bformatter.Deserialize(stream);

            }
            // Adding DataTable into DataSet    
            tempDataSet.Tables.Add(dt);

           using (StringWriter sw = new StringWriter())
            {
                dt.WriteXml(sw);
                CreateXMLFILE = sw.ToString();
            }
          return CreateXMLFILE;

}
投掷错误

dt=(数据表)b格式。反序列化(流)

{“输入流不是有效的二进制格式。起始内容 (以字节为单位)为:50-4B-03-04-14-00-06-00-08-00-00-00-21-00-EB-7A-D2 …“}


有人能告诉我这里做错了什么吗。

正如我在评论中提到的,您可以尝试以下代码来转换字节数组

到数据表

代码:


根据我的测试,我可以重现你的问题。但是,我发现很难成功地将字节数组从excel转换为datatable。因为binaryformatter不知道datatable的结构。因此,我建议您可以直接将excel转换为datatable,而不是使用字节数组。是的,这是一种简单的方法。但是客户端正在发送字节数组格式。如果是这样,我建议您可以先将字节数组转换为excel文件。然后,您可以将excel文件转换为datatable。我不想将excel工作表保存在服务器/本地…正在寻找替代方法。使用这种方法,我已经使用IEXceldataReader编写了代码。如果您不想将excel工作表保存在服务器/本地,我建议您可以在使用后将其删除。
class Program
    {
        static void Main(string[] args)
        {
            byte[] b = File.ReadAllBytes("D:\\2.xlsx");      // you get from the client
            File.WriteAllBytes("test.xlsx", b);             //Create an hourly file
            DataTable table = Exceltodatatable("test.xlsx");  // convert it to datatable
            File.Delete("test.xlsx");                         // delete the file
        }

        public static DataTable Exceltodatatable(string path)
        {
            DataTable dt = new DataTable();
            string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";" + "Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1;MAXSCANROWS=0'";
            using (OleDbConnection conn = new OleDbConnection(connectionString))
            {
                using (OleDbCommand comm = new OleDbCommand())
                {
                    string sheetName = "sheet1";
                    comm.CommandText = "Select * from [" + sheetName + "$]";
                    comm.Connection = conn;
                    using (OleDbDataAdapter da = new OleDbDataAdapter())
                    {
                        da.SelectCommand = comm;
                        da.Fill(dt);
                        return dt;
                    }
                }

            }
        }
    }