Microsoft.Office.Interop.Excel, zapis liczb jako liczb, a nie jako tekstu

0

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ł

1

Nie rozumiem na czym polega problem. Może napisz minimalny przykład i zobacz czy robi to co powinien na nowym, pustym arkuszu.
Ja napisałem właśnie coś takiego i jest to moja pierwsza próba z Interop.Excel:

using Excel = Microsoft.Office.Interop.Excel;

class Program
{
    static void Main()
    {
        var app = new Excel.Application();
        var book = app.Workbooks.Open("c:\\temp\\test.xlsx"); // nie trzeba tych wszystkich Missingów
        var sheet = book.Sheets.Item["Arkusz1"];
        sheet.Cells[1, "A"] = "25";
        book.Close(true);
        app.Quit();
        // to jest tylko przykład. olewamy wyjątki, GC itp.
    }
}

Tak wygląda wynikowy arkusz:

xl.png

Komórka interpretowana jest jako liczba – co widać po domyślnym wyrównaniu do prawej. Również działa prawidłowo.

„U mnie działa”. Może coś za dużo kombinujesz.

0

Dzięki. Faktycznie, przypisując string z liczbą całkowitą, następuje automatyczna konwersja, ze stringa na liczbę. Jednak moje dane zawierają, w 100% liczby z częścią ułamkową. Ale już znalazłem rozwiązanie! W przypadku, wspomnianych, trzech kolumn, parsuje stringa na double i przypisuję jako double i działa.

Dzięki
Pozdrawiam
Michał

1

Może chodzi o separator dziesiętny - Excel przy polskich ustawieniach pewnie oczekuje przecinka.

1 użytkowników online, w tym zalogowanych: 0, gości: 1