Prathap Gangireddy Ответов: 2

Преобразование байт данных в Excel массив в объект DataTable в C# API-интерфейс


The requirement is that the client will send the Excel data in the form of Byte Array (will provide API link for the same to the client)

Now when the API receives the Byte Array, i want to convert into datatable for converting into XML.

Throwing error at

dt = (DataTable)bformatter.Deserialize(stream);

<pre lang="c#">{"The input stream is not a valid binary format. The starting contents (in bytes) are: 50-4B-03-04-14-00-06-00-08-00-00-00-21-00-EB-7A-D2 ..."}


Может ли кто-нибудь подсказать, что я здесь делаю не так?

Что я уже пробовал:

Ниже приведен код, который я пробовал

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;

}

2 Ответов

Рейтинг:
2

Maciej Los

Извините, но не совсем понятно, в чем заключается это требование:

Цитата:
Теперь, когда API получает массив байтов, я хочу преобразовать его в datatable для преобразования в XML.

Вы должны решить, какой результат вы хотите получить: datatable или xml-файл.

Что касается вашего кода...
Файл Excel (*.xlsx) - это не просто текстовый файл. Вы не можете прочитать его содержание с помощью FileStream и BinaryReader. Использование файла Excel Формат OpenXml[^], что означает, что вы должны использовать правильные методы, чтобы прочитать его, изменить и записать. Видеть:
Электронные таблицы (Open XML SDK) | Microsoft Docs[^]
Кстати: файл Excel уже является XML, но в сжатом виде!

Таким образом, если вы хотите извлечь табличные данные из определенного листа файла Excel в объект datatable и сохранить эти данные в xml-файл, самый простой способ-использовать ADO.NET[^] - OleDB.

Видеть:
DataTable dt = new DataTable();
string excelfile = @"C:\PRATAP FOLDER\test.xlsx";
string xmlfile = excelfile.Replace("xlsx", "xml");
string connstring = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0;HDR=YES';", excelFile);
using (OleDbConnection connection = new OleDbConnection(connstring))
{
	string sql = string.Format(@"SELECT * FROM [Sheet1$];", sExcelSheet);
	connection.Open();
	using(OleDbCommand command = new OleDbCommand(sql, connection))
	{
		using (OleDbDataReader reader = command.ExecuteReader())
		{
			dt.Load(reader);
		}
	}
}
if(dt.Rows.Count>0)
    dt.WriteXml(xmlfile);



Другой способ заключается в использовании Библиотека EPPlus [^].


Рейтинг:
1

CPallini

Я полагаю, что вы не можете прочитать двоичный массив из xslx таким образом: вы должны использовать автоматизацию (чтобы избежать разбора самого формата xlsx). Смотрите, например: Автоматизация Excel с помощью Visual C# для заполнения или получения данных с помощью массивов - Office | Microsoft Docs[^].


Maciej Los

5ed!