Существует, многие рассуждают для предпочтения Исключений по коду возврата:
Вы можете увидеть наши образцы ASP.NET (C # и VB) « Excel Chart and Range Imaging Samples » здесь и скачать бесплатную пробную версию здесь , если вы хотите попробовать.
SpreadsheetGear также работает с Windows Forms, консольными приложениями и т. Д. (Вы не указали, какой тип приложения вы создаете). Существует также элемент управления Windows Forms для отображения книги в вашем приложении, если это то, что вам действительно нужно.
Заявление об ограничении ответственности: я владею SpreadsheetGear LLC
Насколько я понимаю из вашего вопроса, я не могу воспроизвести проблему.
Я выбрал диапазон вручную в Excel, выбрал Копировать как изображение с параметрами , как показано на экране , и Bitmap выбраны, затем я использовал следующий код для сохранения данных буфера обмена:
using System;
using System.IO;
using System.Windows;
using System.Windows.Media.Imaging;
using System.Drawing.Imaging;
using Excel = Microsoft.Office.Interop.Excel;
public class Program
{
[STAThread]
static void Main(string[] args)
{
Excel.Application excel = new Excel.Application();
Excel.Workbook wkb = excel.Workbooks.Add(Type.Missing);
Excel.Worksheet sheet = wkb.Worksheets[1] as Excel.Worksheet;
Excel.Range range = sheet.Cells[1, 1] as Excel.Range;
range.Formula = "Hello World";
// copy as seen when printed
range.CopyPicture(Excel.XlPictureAppearance.xlPrinter, Excel.XlCopyPictureFormat.xlPicture);
// uncomment to copy as seen on screen
//range.CopyPicture(Excel.XlPictureAppearance.xlScreen, Excel.XlCopyPictureFormat.xlBitmap);
Console.WriteLine("Please enter a full file name to save the image from the Clipboard:");
string fileName = Console.ReadLine();
using (FileStream fileStream = new FileStream(fileName, FileMode.Create))
{
if (Clipboard.ContainsData(System.Windows.DataFormats.EnhancedMetafile))
{
Metafile metafile = Clipboard.GetData(System.Windows.DataFormats.EnhancedMetafile) as Metafile;
metafile.Save(fileName);
}
else if (Clipboard.ContainsData(System.Windows.DataFormats.Bitmap))
{
BitmapSource bitmapSource = Clipboard.GetData(System.Windows.DataFormats.Bitmap) as BitmapSource;
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bitmapSource));
encoder.QualityLevel = 100;
encoder.Save(fileStream);
}
}
object objFalse = false;
wkb.Close(objFalse, Type.Missing, Type.Missing);
excel.Quit();
}
}
Что касается вашей второй проблемы: насколько я знаю, это невозможно в Excel для одновременного выбора диапазона ячеек и изображения. Если вы хотите получить оба изображения одновременно, вам, возможно, придется распечатать лист Excel в файл изображения / PDF / XPS.
Поскольку поток asp.net не имеет права ApartmentState для доступа к классу буфера обмена, вы должны написать код для доступа к буферу обмена в новом потоке. Например:
private void AccessClipboardThread()
{
// access clipboard here normaly
}
в основном потоке:
....
Excel.Range range = sheet.get_Range(startRange, endRange); //Save range image to clipboard
Thread thread = new Thread(new ThreadStart(AccessClipboardThread));
thread.ApartmentState = ApartmentState.STA;
thread.Start();
thread.Join(); //main thread will wait until AccessClipboardThread finish.
....
Интересно, что я некоторое время успешно делал это в отсеке STA. Я написал приложение, которое запускается еженедельно и рассылает по почте отчеты о состоянии проекта, включая некоторые графики, которые я генерирую программно с помощью Excel.
Вчера вечером это не удалось, все графики вернули ноль. Сегодня я занимаюсь отладкой и не нахожу объяснений, что метод Clipboard.GetImage () внезапно возвращает null, чего не произошло. Установив точку останова при этом вызове, я могу эффективно продемонстрировать (нажав CTRL + V в MS-Word), что изображение действительно находится в буфере обмена. Увы, продолжение работы с Clipboard. GetImage () возвращает значение null (независимо от того, слежу ли я так или нет).
Мой код работает как консольное приложение, а метод Main имеет атрибут [STAThread]. Я отлаживаю его как приложение Windows Forms (весь мой код находится в библиотеке, и у меня просто два внешних интерфейса для этого).
Оба сегодня возвращают null.
Из интереса я превратил сборщик диаграмм в поток, как описано (и обратите внимание, что thread.ApartmentState устарел), и он отлично работает, но все равно возвращаются нули.
Ну, я сдался и сделал что бы сделал любой компьютерный компьютерщик, перезагрузился.
Вуаля ... все было хорошо. Подумайте ... вот почему мы все ненавидим компьютеры, Microsoft Windows и Microsoft Office? Хммм ... Что-то, что-то совершенно временное, что может случиться с вашим ПК, приводит к сбою Clipboard.GetImage ()!
Ну, я сдался и сделал то, что сделал бы любой компьютерный компьютерщик, - перезагрузился.
Вуаля ... все было хорошо. Подумайте ... вот почему мы все ненавидим компьютеры, Microsoft Windows и Microsoft Office? Хммм ... Что-то, что-то совершенно временное, что может случиться с вашим компьютером, приводит к сбою Clipboard.GetImage ()!
Ну, я сдался и сделал то, что сделал бы любой компьютерный компьютерщик, перезагрузился.
Вуаля ... все было хорошо. Подумайте ... вот почему мы все ненавидим компьютеры, Microsoft Windows и Microsoft Office? Хммм ... Что-то, что-то совершенно временное, что может случиться с вашим ПК, приводит к сбою Clipboard.GetImage ()!