:: Не фоксом единым
Excel округляет
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Есть программа на C#. С помощью OleDbConnection() данные считываются из Excel-евского файла в DataSet.

Часть текста скрыта
public static void ExcelFileToDataTable(out DataTable dtData, string sFile, string sRequest)
{
DataSet dsData = new DataSet();
const string provider = "Microsoft.ACE.OLEDB.12.0";
string extProp = sFile.EndsWith(".xlsx", StringComparison.CurrentCulture) ? "Excel 12.0 Xml" : "Excel 8.0";
string sConnStr = $"Provider={provider};Data Source={sFile};Extended Properties=\"{extProp};HDR=YES\";";
using (OleDbConnection odcConnection = new OleDbConnection(sConnStr))
{
odcConnection.Open();
if (sRequest.IndexOf("$SHEETS$", StringComparison.CurrentCulture) != -1)
{
using (DataTable dtMetadata = odcConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[4] { null, null, null, "TABLE" }))
{
for (int i = 0; i < dtMetadata.Rows.Count; i++)
{
if (dtMetadata.Rows["TABLE_NAME"].ToString().IndexOf("$", StringComparison.CurrentCulture) == -1)
{
dtMetadata.Rows.Remove(dtMetadata.Rows[i]);
}
}
foreach (DataRow drRow in dtMetadata.Rows)
{
string sLocalRequest = sRequest.Replace("$SHEETS$", String.Format("[{0}]", drRow["TABLE_NAME"]));
OleDbCommand odcCommand = new OleDbCommand(sLocalRequest, odcConnection);
using (OleDbDataAdapter oddaAdapter = new OleDbDataAdapter((OleDbCommand)odcCommand))
{
oddaAdapter.Fill(dsData);
}
}
}
}
else
{
OleDbCommand odcCommand = new OleDbCommand(sRequest, odcConnection);
using (OleDbDataAdapter oddaAdapter = new OleDbDataAdapter(odcCommand))
{
oddaAdapter.Fill(dsData);
}
}
odcConnection.Close();
}
dtData = dsData.Tables[0];
}


Затем из dtData извлекаются данные:

string summa = dtData.Rows[1].row[1].ToString();

В Excel-евом файле в ячейке установлено значение с четырьмя знаками после запятой. А в формате ячейки стоит два знака после запятой. Например, физически в ячейке 1.9998, а отображается 2.00. В summa попадает "2.00". Если зайти в файл, и указать в формате ячейки "четыре знака после запятой", то в summa попадает "1.9998". Файлы генерирует другая система, и нет возможности на неё повлиять. Надо сделать так, что бы программой скачивалось реальное значение, а не округлённое. Как можно сделать, что бы каждый раз не заходить в файл и не менять вручную формат ячейки?



[i]Исправлено 2 раз(а). Последнее : S-type, 23.04.18 15:30
Ratings: 0 negative/0 positive
Re: Excel округляет
Гулин Федор

Сообщений: 4640
Откуда: Минск
Дата регистрации: 24.10.2002
макрос посмотреть что делает - когда ставит 4 знака
и прописать этот же код в исходник
Ratings: 0 negative/0 positive
Re: Excel округляет
pasha_usue

Сообщений: 3650
Откуда: Е-бург
Дата регистрации: 06.10.2006
Установка IMEX=1 для драйвера. С одной стороны, она позволяет считать значения разного типа из ячеек экселя (intermixed). С другой стороны, считывается не "значение" (value) ячейки, а текстовое "представление" (text) ячейки.
Либо отключать IMEX, либо использовать более другой способ чтения. Microsoft.Office.Interop.Excel?
Ratings: 0 negative/0 positive
Re: Excel округляет
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Коллеги, спасибо за помощь.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 7 (Гостей: 7)

© 2000-2024 Fox Club 
Яндекс.Метрика