Dzień dobry.
Próbuję zapisać dane do pliku xlsx, za pomocą Interop.Excel, w C#. Proces zapisu przechodzi bez problemu, jednak liczby są zapisywane jako tekst. Żeby ustawić je, jako liczby, muszę otworzyć plik i, klikając na żółty trójkącik, zmienić je na liczby. Co prawda, mam tylko 3 kolumny do takiej zmiany, a i tabela nie jest duża. Jednak chciałbym zrobić to automatycznie, z poziomu C#.
Przeczytałem na jednym z angielskich for, stron, grup, że takie działanie jest normalne i zamierzone (tj. wstawianie apostrofa przed liczbę, przez co wyświetla się ona jako tekst) i, z tego co zrozumiałem, ma zabezpieczać przed niechcianą utratą dokładności danych.
Na innej stronie przeczytałem, że nie ma możliwości zrobienia tego w C#.
Ale wolę się upewnić, jako, że wszyscy jesteśmy ludźmi i popełniamy błędy, zarówno lingwistyczne, jak i merytoryczne.
Proszę o pomoc: jak przekonwertować tekst w Excelu, na liczbę, z poziomu C#
Załączam fragment mojego kodu, jakby był z jakiś powodów potrzebny:
private void UpdateFile(string filePath, string[,] data)
{
string[] colNames = { "A", "B", "C", "D", "E", "F", "G", "H" };
int[] notToUpdate = { 5, 7 }; // 0-indexed
int[] rowRange = { 8, 29 }; // 1-indexed
int[] colsToEraseAp = { 2, 4, 6 };//0-indexed
string sheetName = "Arkusz1";
if (colNames.Length != data.GetLength(1))
{
MessageBox.Show("Niespójna ilość danych");
return;
}
if (data.GetLength(0) > rowRange[1] - rowRange[0] + 1)
{
MessageBox.Show("Zbyt dużo rekordów. Awaryjne wyjście");
return;
}
//MessageBox.Show(data[0, 4]);
Excel.Application app = new Excel.Application();
//app.ErrorCheckingOptions.BackgroundChecking = false;
app.Visible = false;
Excel.Workbook workbook = null;
Excel.Worksheet worksheet = null;
try
{
workbook = app.Workbooks.Open(filePath, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
worksheet = (Excel.Worksheet)workbook.Sheets[sheetName];
for (int i = 0; i < data.GetLength(0); i++)
{
for (int col = 0; col < colNames.Length; col++)
{
if (DoesContain(notToUpdate, col))
continue;
worksheet.Cells[rowRange[0] + i, colNames[col]] = data[i, col];
//if (DoesContain(colsToEraseAp, col))
// worksheet.Range[colNames[col] + (rowRange[0] + i), colNames[col] + (rowRange[0] + i)].Replace("'", "");
}
}
//worksheet.Range["E8", "E29"].Replace("'", "");
//worksheet.Range["E8", "E29"].NumberFormat = "0";
//worksheet.Range["E8", "E29"].NumberFormat = "0.00%";
workbook.Close(true);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
app.Quit();
if (worksheet != null)
Marshal.FinalReleaseComObject(worksheet);
if (workbook != null)
Marshal.FinalReleaseComObject(workbook);
if (app != null)
Marshal.FinalReleaseComObject(app);
}
}
Dzięki, pozdrawiam.
Michał