Программно (C#) преобразовывают Excel в изображение

Существует, многие рассуждают для предпочтения Исключений по коду возврата:

  • Обычно, для readibility, люди пытаются минимизировать количество оператора возврата в методе. Делая так, исключения предотвращают, чтобы сделать некоторую дополнительную работу, в то время как в состоянии incoorect, и таким образом предотвращают для потенциального повреждения большего количества данных.
  • Исключение обычно более подробный arn более легко расширяемый, чем возвращаемое значение. Предположите, что метод возвращает натуральное число и что Вы используете отрицательные числа в качестве кода возврата, когда ошибка происходит, если объем Вас, изменение метода и теперь возвращает целые числа, необходимо будет изменить все вызовы метода вместо того, чтобы просто настроить немного исключение.
  • Исключения позволяет более легко разделять обработку ошибок нормального поведения. Они позволяют удостоверяться, что некоторые операции работают так или иначе как атомарная операция.
10
задан Zurb 18 August 2009 в 08:47
поделиться

4 ответа

SpreadsheetGear for .NET

Вы можете увидеть наши образцы ASP.NET (C # и VB) « Excel Chart and Range Imaging Samples » здесь и скачать бесплатную пробную версию здесь , если вы хотите попробовать.

SpreadsheetGear также работает с Windows Forms, консольными приложениями и т. Д. (Вы не указали, какой тип приложения вы создаете). Существует также элемент управления Windows Forms для отображения книги в вашем приложении, если это то, что вам действительно нужно.

Заявление об ограничении ответственности: я владею SpreadsheetGear LLC

3
ответ дан 4 December 2019 в 01:57
поделиться

Насколько я понимаю из вашего вопроса, я не могу воспроизвести проблему.

Я выбрал диапазон вручную в 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.

4
ответ дан 4 December 2019 в 01:57
поделиться

Поскольку поток 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.
....
1
ответ дан 4 December 2019 в 01:57
поделиться

Интересно, что я некоторое время успешно делал это в отсеке 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 ()!

0
ответ дан 4 December 2019 в 01:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: