Открытие файла excel вызывает окно с сообщением "восстановление содержимого книги",

Пока я пытаюсь открыть файл excel, появляется окно с сообщением типа "Мы обнаружили проблему с некоторым содержимым в имени файла. Хочешь, чтобы мы попытались восстановить столько, сколько мы можем? источник этой книги, нажмите" Да ".". На самом деле, у меня есть шаблон excel, разработанный и копирующий файл в другой файл, и созданный файл temp. Я вставляю данные в файл temp с помощью OPEN XML, и данные поступают из базы данных.

Я пробовал решения, предоставляемые в сети, но эти исправления не разрешают мою проблему. Мое преимущество - 2010

enter image description here

enter image description here

Любое предоставляемое решение очень ценится.

Ответ 1

У меня была эта проблема. Это было вызвано тем, как я хранил числа и строки в ячейках.

Числа могут быть сохранены просто с помощью cell.CellValue = new CellValue("5"), но для нечислового текста необходимо вставить строку в элемент SharedStringTable и получить индекс этой строки. Затем измените тип данных ячейки на SharedString и установите для значения ячейки индекс строки в SharedStringTable.

// Here is the text I want to add.
string text = "Non-numeric text.";

// Find the SharedStringTable element and append my text to it.
var sharedStringTable = document.WorkbookPart.GetPartsOfType<SharedStringTablePart>().First().SharedStringTable;
var item = sharedStringTable.AppendChild(new SharedStringItem(new Text(text)));

// Set the data type of the cell to SharedString.
cell.DataType = new EnumValue<CellValues>(CellValues.SharedString);

// Set the value of the cell to the index of the SharedStringItem.
cell.CellValue = new CellValue(item.ElementsBefore().Count().ToString());

Это объясняется в документации здесь: http://msdn.microsoft.com/en-us/library/office/cc861607.aspx

Ответ 2

Еще несколько случаев, которые могут вызвать такой тип ошибки:

  • Ваше имя листа длиннее 31 символа
  • У вас есть недопустимые символы в имени листа
  • У вас есть ячейки со значениями длиннее 32k

Ответ 3

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

Вы можете определить:

  • до 4000 стилей в рабочей книге .xls
  • до 64000 стилей в рабочей книге .xlsx

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

Ответ 4

Я добавил правильный cellReference и исправил эту проблему для меня:

string alpha = "ABCDEFGHIJKLMNOPQRSTUVQXYZ";
for (int colInx = 0; colInx < reader.FieldCount; colInx++)
{
    AppendTextCell(alpha[colInx] + "1", reader.GetName(colInx), headerRow);
}

private static void AppendTextCell(string cellReference, string cellStringValue, Row excelRow)
{
    //  Add a new Excel Cell to our Row 
    Cell cell = new Cell() { CellReference = cellReference, DataType = new EnumValue<CellValues>(CellValues.String) };
    CellValue cellValue = new CellValue();
    cellValue.Text = cellStringValue.ToString();
    cell.Append(cellValue);
    excelRow.Append(cell);
}

Ответ 5

Проблема связана с использованием

package.Save();

и

package.GetAsByteArray();

в то же время

когда мы звоним

package.GetAsByteArray();

он будет выполнять следующие операции

this.Workbook.Save(); this._package.Close(); this._package.Save(this._stream);

Следовательно, удаление

package.Save();

решит эту проблему "Мы обнаружили проблему с некоторым содержимым в имени файла. Хотите, чтобы мы попытались восстановить столько, сколько мы можем? Если вы доверяете источнику этой книги, нажмите" Да "."

Ответ 6

То же предупреждение, но проблема со мной заключалась в том, что я использовал входные данные клиента (имя волны) в качестве имени листа для файла, а когда в имени была представлена дата, символ "/", используемый в качестве разделителя части даты, вызывал проблему.

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

Ответ 7

Проблема была из-за сохранения строки в ячейке напрямую с помощью cell.CellValue = new CellValue ("Text"). Можно хранить числа, подобные этой, но не строку. Для строки определите тип данных как строку перед назначением текста с помощью Cell.DataType = CellValues.String;