Легко создать локальную таблицу Excel в Asp.net и распространить ее с сервера, но трудно удалить встроенный процесс Excel.exe. Поэтому не открывайте диспетчер задач, чтобы проверить, остались ли в памяти файлы, связанные с процессом Excel.exe. Здесь я предлагаю решение, которое предоставляет два метода:
«CreateExcelWorkbook» (описывает, как создать книгу Excel). Этот метод запускает хранимую процедуру, возвращает DataReader и создает книгу Excel на основе DataReader, сохраняет ее в файловой системе и создает соединение «загрузки», чтобы пользователь мог можно загрузить Excel Таблицу можно импортировать в браузер или загрузить непосредственно в машину.
Второй метод: GenerateCSVReport по сути делает то же самое, за исключением того, что он сохраняет файл в формате CSV. Код CSV, импортированный в Excel, может решить распространенную проблему при разработке: в столбце записано несколько нулей, и код CSV может гарантировать, что нули не пусты. (Объяснение: проблема заключается в том, что в таблице Excel невозможно сохранить несколько нулевых значений)
Загружаемое решение содержит действительный класс SPGen, который запускает хранимую процедуру и возвращает DataReader, а также метод удаления, который удаляет файлы старше определенного значения времени. Основной метод, показанный ниже, — CreateExcelWorkbook.
Примечание. Вы должны знать, что при запуске этой страницы вам могут потребоваться права администратора для записи файлов Excel и Csv в файловой системе сервера WebSever. Самый простой способ справиться с этой проблемой — запустить страницу в отдельной папке и включить собственный файл конфигурации. И добавьте следующий элемент <identity impersonate ="true" ... в файл конфигурации. Вам по-прежнему необходим доступ на запись к списку управления доступом (ACL) физической папки только для того, чтобы удостоверение, которое вы запускаете на странице, имело доступ на запись. Наконец, вам необходимо настроить COM-соединение с библиотекой типов Excel 9.0 или Excel 10. , VS.NET Для вас будет сгенерирована сборка. Я полагаю, что у Microsoft на веб-сайте Office есть ссылка для загрузки первоначальной сборки Microsoft. (Может быть неточно, насколько я понимаю, это сборка для .net)
<identity impersonate="true" userName="adminuser" пароль="adminpass" />
Обратите особое внимание на следующий блок кода, который очищает объекты Excel.
// Нужен весь следующий код, чтобы очистить и погасить все ссылки!!!
oWB.Close(ноль,ноль,ноль);
oXL.Workbooks.Close();
оXL.Выход();
System.Runtime.InteropServices.Marshal.ReleaseComObject (oRng);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oXL);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oWB);
oSheet = ноль;
oWB=ноль;
oXL = ноль;
GC.Collect(); // принудительная окончательная очистка!
Это необходимо, поскольку oSheet, «oWb», «oRng» и другие объекты также являются экземплярами COM. Нам нужен
метод ReleaseComObject класса Marshal, чтобы удалить их из
частного void CreateExcelWorkbook(string spName, SqlParameter[] parms)
.NET.)
{
строка strCurrentDir = Server.MapPath(".") + "\";
RemoveFiles(strCurrentDir); // служебный метод для очистки старых файлов
Excel.Приложение oXL;
Excel._Workbook oWB;
Excel._Worksheet oSheet;
Excel.Range oRng
попробуйте
;
{
GC.Collect();// убираем всех остальных ребят из Excel, которые слоняются поблизости...
oXL = новое Excel.Приложение();
oXL.Visible = ложь;
//Получить новую книгу.
oWB = (Excel._Workbook)(oXL.Workbooks.Add( Missing.Value ));
oSheet = (Excel._Worksheet) oWB.ActiveSheet;
// получаем строку данных
strConnect = System.Configuration.ConfigurationSettings.AppSettings["connectString"];
SPGen sg = новый SPGen(strConnect,spName,parms);
SqlDataReader myReader = sg.RunReader();
// Создаем заголовок и лист...
интервал iRow = 2;
for(int j=0;j<myReader.FieldCount;j++)
{
oSheet.Cells[1, j+1] = myReader.GetName(j).ToString();
}
// строим содержимое листа
пока (myReader.Read())
{
for(int k=0;k <myReader.FieldCount;k++)
{
oSheet.Cells[iRow,k+1]= myReader.GetValue(k).ToString();
}
iРоу++;
}//конец, пока
мойЧтение.Закрыть();
myReader = ноль;
//Отформатируйте A1:Z1 жирным шрифтом, вертикальное выравнивание = по центру.
oSheet.get_Range("A1", "Z1").Font.Bold = true;
oSheet.get_Range("A1", "Z1").VerticalAlignment =Excel.XlVAlign.xlVAlignCenter;
//Автоподбор столбцов A:Z.
oRng = oSheet.get_Range("A1", "Z1");
oRng.EntireColumn.AutoFit();
oXL.Visible = ложь;
oXL.UserControl = ложь;
строка strFile = "отчет" + System.DateTime.Now.Ticks.ToString() +".xls";
oWB.SaveAs( strCurrentDir + strFile, Excel.XlFileFormat.xlWorkbookNormal,
null,null,false,false,Excel.XlSaveAsAccessMode.xlShared,false,false,null,null,null);
// Нужен весь следующий код, чтобы очистить и погасить все ссылки!!!
oWB.Close(ноль,ноль,ноль);
oXL.Workbooks.Close();
оXL.Выход();
System.Runtime.InteropServices.Marshal.ReleaseComObject (oRng);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oXL);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oWB);
oSheet = ноль;
oWB=ноль;
oXL = ноль;
GC.Collect(); // принудительная окончательная очистка!
строка strMachineName = Request.ServerVariables["SERVER_NAME"];
errLabel.Text="<A href=http://" + strMachineName +"/ExcelGen/" +strFile + ">Загрузить отчет</a>"
}
;
catch(Исключение theException)
{
Строка errorMessage;
errorMessage = "Ошибка: ";
errorMessage = String.Concat( errorMessage, theException.Message );
errorMessage = String.Concat( errorMessage, "Line:");
errorMessage = String.Concat( errorMessage, theException.Source );
errLabel.Text= errorMessage;
}
}
Ниже приводится оригинальная статья «Создание
динамических книг Excel ASP.NET на C#»,
написанная Питером А. Бромбергом, доктором философии.
Версия для печати
В загружаемом решении также есть служебный класс «SPGen», который управляет запуском сохраненных файлов
. Создание собственных электронных таблиц Excel с вашего веб-сервера не так уж и сложно с помощью ASP.NET. Что может быть трудным, так это удалить экземпляры Excel.exe. вы не откроете TaskMgr и не увидите 123 экземпляра EXCEL.EXE, все еще находящихся в памяти. Здесь я предлагаю решение, имеющее два метода: «CreateExcelWorkbook», которое запускает хранимую процедуру, которая возвращает DataReader и собирает из нее собственную книгу Excel. он сохраняет его в файловой системе и создает ссылку «Загрузить», чтобы пользователь мог либо загрузить отчет в Excel в своем браузере, либо загрузить файл XLS. Второй метод, GenerateCSVReport, делает по сути то же самое, но создает CSV. файл, который, конечно же, также будет загружен в Excel. Код CSV правильно решает распространенную проблему разработчиков: если у вас есть столбец с ведущими нулями, они сохраняются.
процедуры и возврат DataReaders, а также служебный метод RemoveFiles, который очищает любой файл XLS или CSV старше указанного количества минут. Ключевой метод, представленный ниже, — это метод CreateExcelWorkbook.
ПРИМЕЧАНИЕ. Следует иметь в виду, что вам, вероятно, придется его запустить. страница под учетной записью, имеющей права администратора, поскольку ей необходимы права на запись для хранения сгенерированных файлов Excel или CSV в файловой системе веб-сервера. Вероятно, самый простой способ справиться с этим — разместить страницу в отдельной папке с собственным файлом web.config. и вставьте элемент <identity impersonate ="true" ... Вам также может потребоваться включить разрешения ACL для физической папки, чтобы удостоверение, под которым работает страница, имело разрешения на запись. COM-ссылку на библиотеку типов Excel 9.0 или Excel 10 и позвольте VS.NET генерировать для вас сборки взаимодействия. Я полагаю, что у MS также есть ссылка на их сайте Office, где вы можете загрузить основные сборки взаимодействия Office.
<identity impersonate="true" userName="adminuser" пароль="adminpass" />
Обратите особое внимание на блок кода, который выполняет «очистку» объектов Excel:
// Требуется весь следующий код для очистки и уничтожения всех ссылок!!!
oWB.Close(ноль,ноль,ноль);
oXL.Workbooks.Close();
оXL.Выход();
System.Runtime.InteropServices.Marshal.ReleaseComObject (oRng);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oXL);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oWB);
oSheet = ноль;
oWB=ноль;
oXL = ноль;
GC.Collect(); // принудительная окончательная очистка!
Это необходимо, потому что все эти маленькие объекты «oSheet», «oWb», «oRng» и т. д. являются экземплярами COM, и нам нужно использовать метод InteropServices ReleaseComObject класса Marshal, чтобы избавиться от них в .NET
. CreateExcelWorkbook (строка spName, SqlParameter[] parms)
{
строка strCurrentDir = Server.MapPath(".") + "\";
RemoveFiles(strCurrentDir); // служебный метод для очистки старых файлов
Excel.Приложение oXL;
Excel._Workbook oWB;
Excel._Worksheet oSheet;
Excel.Range oRng
попробуйте
;
{
GC.Collect();// убираем всех остальных ребят из Excel, которые слоняются поблизости...
oXL = новое Excel.Приложение();
oXL.Visible = ложь;
//Получить новую книгу.
oWB = (Excel._Workbook)(oXL.Workbooks.Add( Missing.Value ));
oSheet = (Excel._Worksheet) oWB.ActiveSheet;
// получаем строку данных
strConnect = System.Configuration.ConfigurationSettings.AppSettings["connectString"];
SPGen sg = новый SPGen(strConnect,spName,parms);
SqlDataReader myReader = sg.RunReader();
// Создаем заголовок и лист...
интервал iRow = 2;
for(int j=0;j<myReader.FieldCount;j++)
{
oSheet.Cells[1, j+1] = myReader.GetName(j).ToString();
}
// строим содержимое листа
пока (myReader.Read())
{
for(int k=0;k <myReader.FieldCount;k++)
{
oSheet.Cells[iRow,k+1]= myReader.GetValue(k).ToString();
}
iРоу++;
}//конец, пока
мойЧтение.Закрыть();
myReader = ноль;
//Отформатируйте A1:Z1 жирным шрифтом, вертикальное выравнивание = по центру.
oSheet.get_Range("A1", "Z1").Font.Bold = true;
oSheet.get_Range("A1", "Z1").VerticalAlignment =Excel.XlVAlign.xlVAlignCenter;
//Автоподбор столбцов A:Z.
oRng = oSheet.get_Range("A1", "Z1");
oRng.EntireColumn.AutoFit();
oXL.Visible = ложь;
oXL.UserControl = ложь;
строка strFile = "отчет" + System.DateTime.Now.Ticks.ToString() +".xls";
oWB.SaveAs( strCurrentDir + strFile, Excel.XlFileFormat.xlWorkbookNormal,
null,null,false,false,Excel.XlSaveAsAccessMode.xlShared,false,false,null,null,null);
// Нужен весь следующий код, чтобы очистить и погасить все ссылки!!!
oWB.Close(ноль,ноль,ноль);
oXL.Workbooks.Close();
оXL.Выход();
System.Runtime.InteropServices.Marshal.ReleaseComObject (oRng);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oXL);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oWB);
oSheet = ноль;
oWB=ноль;
oXL = ноль;
GC.Collect(); // принудительная окончательная очистка!
строка strMachineName = Request.ServerVariables["SERVER_NAME"];
errLabel.Text="<A href=http://" + strMachineName +"/ExcelGen/" +strFile + ">Загрузить отчет</a>"
}
;
catch(Исключение theException)
{
Строка errorMessage;
errorMessage = "Ошибка: ";
errorMessage = String.Concat( errorMessage, theException.Message );
errorMessage = String.Concat( errorMessage, "Line:");
errorMessage = String.Concat( errorMessage, theException.Source );
errLabel.Text= errorMessage;
}
}
-Переведено в спешке, пожалуйста, простите меня, если есть какие-либо ошибки. Добро пожаловать, чтобы дать совет и обсудить --- Сяо Сюй
http://macroxu-1982.cnblogs.com/archive/2006/05/31/413879.html
.