Взаимодействие с Excel - как остановить «оценку» числа (сохраненного в виде текста) - PullRequest
5 голосов
/ 28 июня 2010

Мне было интересно, сталкивался ли кто-нибудь со следующей проблемой и имел ли какие-либо идеи о том, как ее решить: я экспортирую данные из приложения C # (.NET 3.5) в Excel (2003) через Interop.В одном из столбцов хранится строковое значение, которое представляется числовым.То есть это число, которое начинается с 0, например, 000123

Мне нужно сохранить полный номер, так как это может быть серийный номер или что-то подобное.Excel не заинтересован в этом, поэтому я подумал, что смогу обойти это, установив целевую ячейку в целом.Когда я экспортирую в Excel, я нахожу 123 хранящихся вместо 000123.

Я запустил приложение в отладке и в найденном мной списке наблюдения (для «Range range»:

range.NumberFormat = "General"`
this.Rows[iGridRow].Cells[iGridCol].Value = "000123" '/* (datagrid is not truncating it)*/
range.Value2 = 123.0

Кажется, он обрабатывается как число, хотя я установил числовой формат до этого момента:

range.NumberFormat = sNumberFormat;
range = (Range)sheet.Cells[iExcelRow, iExcelCol];
range.Value2 = this.Rows[iGridRow].Cells[iGridCol].Value.ToString();

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

Ответы [ 4 ]

4 голосов
/ 28 июня 2010

Добавьте один апостроф ' перед номером.Excel затем будет обрабатывать число как строку.

2 голосов
/ 04 сентября 2012

Я знаю, что уже поздно, но, возможно, кому-то это понадобится в будущем. Это не совсем для производительности, но вы можете сначала сохранить его в двумерном массиве.

object[,] Values = new object[iGrid.Rows.Count, IGrid.Columns.Count];
            for (int i = 0; i < alllogentry.Rows.Count; i++)
            {
                for (int j = 0; j < alllogentry.Columns.Count; j++)
                {
                    if (alllogentry.Rows[i].Cells[j].Value != null)
                    {
                        Values[i, j] = alllogentry.Rows[i].Cells[j].Value.ToString();
                    }
                    else
                    {
                        Values[i, j] = " ";
                    }
                }
            }

Таким образом, число остается номером, а строка остается строкой.

Также передайте информацию с помощью массовой вставки, чтобы превзойти ее, а не ячейку за ячейкой. Это был мой код.

// Bulk Transfer
String MaxRow = (alllogentry.Rows.Count+6).ToString();
 String MaxColumn = ((String)(Convert.ToChar(alllogentry.Columns.Count / 26 + 64).ToString() + Convert.ToChar(alllogentry.Columns.Count % 26 + 64))).Replace('@', ' ').Trim();
String MaxCell = MaxColumn + MaxRow;

//Format
worksheet.get_Range("A1", MaxColumn + "1").Font.Bold = true;
worksheet.get_Range("A1", MaxColumn + "1").VerticalAlignment = XlVAlign.xlVAlignCenter;

// Insert Statement
    worksheet.get_Range("A7", MaxCell).Value2 = Values;
1 голос
/ 24 августа 2011

Правильный тип не является общим, потому что общий попытается угадать правильный тип, который в данном случае является числовым, но вы должны указать его как текст, чтобы не обрезать начальные нули.

Попробуйте следующий код:

Range cell = ActiveWorksheet.Cells[1,1];
//The @ is the indicator for Excel, that the content should be text
const string textIndicator = "@";
//Change the NumberFormat from 'General' to 'Text'
cell.NumberFormat = textIndicator;
//Set the Value
cell.Value2 = "000123";
1 голос
/ 28 июля 2011

Я использую этот макрос.Он вставляет апостроф перед каждым числовым значением в каждой ячейке.

Sub Macro1()
    Dim rwIndex As Integer
    Dim colIndex As Integer
    For rwIndex = 1 To ActiveSheet.UsedRange.Rows.Count
            For colIndex = 1 To ActiveSheet.UsedRange.Columns.Count
                If IsNumeric(Cells(rwIndex, colIndex).Value) Then _
                    Cells(rwIndex, colIndex).Value = "'" _
                     & Cells(rwIndex, colIndex).Value
            Next colIndex
    Next rwIndex
End Sub
...