iT邦幫忙

0

C# Excel 轉 jpg

求解,沒辦法,轉不成功
以下我的code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using EXCEL = Microsoft.Office.Interop.Excel;
using System.IO;

namespace _5_23_excel__to_jpg
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
///
/// Excel文檔Jpg圖片
///
public class ConvertEXCEL
{
///
/// 圖片保存路徑。System.IO.Path.GetTempPath() + @"cache{0}.jpg"
///
private static string SAVEEXCELJPG = @"D:\DocToImg\666{0}.jpg";
///
/// 暫時網頁保存文件路徑
/// Path.GetTempPath() + @"cache{0}.htm"
///
private static string TEMPHTMLPATH = @"D:\DocToImg\666\Excel.htm";

        /// <summary>
        /// Excel文檔轉換成JPG圖片文件
        /// </summary>
        /// <param name="excelPath">Excel文件路徑</param>
        /// <returns>JPG圖片路徑</returns>
        public static string EXCELConvertImage(string excelPath)
        {
            EXCEL.Application appExcel = new Microsoft.Office.Interop.Excel.Application();
            appExcel.Visible = false;
            object obj = Type.Missing;
            object fileHtml = TEMPHTMLPATH;
            object format = EXCEL.XlFileFormat.xlHtml;
            EXCEL.Workbook xls = appExcel.Workbooks.Open(excelPath, obj, obj, obj, obj, obj, obj, obj, obj, obj, obj, obj, obj, obj, obj);

            xls.SaveAs(fileHtml, format, obj, obj, obj, obj, EXCEL.XlSaveAsAccessMode.xlExclusive, obj, obj, obj, obj, obj);
            appExcel.Quit();
            string HTMLImage = ConvertHTML.HTMLConvertImage(fileHtml.ToString());
            DeleteTempFile(fileHtml.ToString());
            return HTMLImage;
        }

        public static string GetExcel(string excelFilePath)
        {
            EXCEL.Application app = new Microsoft.Office.Interop.Excel.Application();
            object objMis = Type.Missing;
            EXCEL.Workbook singleExcel = app.Workbooks.Open(excelFilePath, objMis, objMis, objMis, objMis, objMis, objMis, objMis, objMis, objMis, objMis, objMis, objMis, objMis, objMis);
            try
            {
                //wsheet.UsedRange.Select();
                for (int i = 1; i <= singleExcel.Worksheets.Count; i++)
                {
                    EXCEL.Worksheet wsheet = (EXCEL.Worksheet)singleExcel.Worksheets[i];

                    //Clipboard.Clear();

                    object ranobj = DBNull.Value;

                    //設置選擇單元格,在複製出來,Excel轉換成圖片的操作方法
                    wsheet.get_Range("A1", "D3").Copy(ranobj);
                    //全選單元格,全部複製出来。Excel轉換成圖片的操作方法。
                  
                    //wsheet.UsedRange.Copy(objMis);
                    //Clipboard.SetDataObject(objMis);
                    IDataObject iData = Clipboard.GetDataObject();
                    Bitmap bits = (Bitmap)iData.GetData(DataFormats.Bitmap);
                    Bitmap myBitmap = new Bitmap(bits.Width, bits.Height);
                    Graphics g = Graphics.FromImage(myBitmap);
                    g.DrawImage(bits, 0, 0);
                    myBitmap.Save(string.Format(SAVEEXCELJPG, Guid.NewGuid()));

                    Clipboard.Clear();
                    myBitmap.Dispose();
                    bits.Dispose();
                }

            }
            catch (Exception Excel)
            {
                throw Excel;
            }
            finally
            {
                singleExcel.Close(objMis, objMis, objMis);
                app.Quit();
            }
            return string.Empty;
        }

        /// <summary>  
        /// 刪除指定的臨時文件
        /// </summary>
        /// <param name="filePath"></param>
        private static void DeleteTempFile(string filePath)
        {
            File.Delete(filePath);
        }
    }
}

}
參考:
http://www.cnblogs.com/lyl6796910/archive/2013/01/24/2875799.html
https://ithelp.ithome.com.tw/upload/images/20180523/20109425GuSaF6qLq0.jpg
https://ithelp.ithome.com.tw/upload/images/20180523/20109425NJMmunpgFi.jpg

看更多先前的討論...收起先前的討論...
優悠 iT邦新手 3 級 ‧ 2018-05-23 10:36:06 檢舉
移去紅色波浪(converthtml,看錯誤訊息
應該沒引用到東西
小魚 iT邦大師 1 級 ‧ 2018-05-23 12:02:56 檢舉
我不是說只要GetExcel這個函式就好了嗎...
ted8224 iT邦新手 5 級 ‧ 2018-05-23 16:23:10 檢舉
那個我試過了小魚大

public static string GetExcel(string excelFilePath)
{
EXCEL.Application app = new Microsoft.Office.Interop.Excel.Application();
object objMis = Type.Missing;
EXCEL.Workbook singleExcel = app.Workbooks.Open(excelFilePath, objMis, objMis, objMis, objMis, objMis, objMis, objMis, objMis, objMis, objMis, objMis, objMis, objMis, objMis);
try
{
//wsheet.UsedRange.Select();
for (int i = 1; i <= singleExcel.Worksheets.Count; i++)
{
EXCEL.Worksheet wsheet = (EXCEL.Worksheet)singleExcel.Worksheets[i];

//Clipboard.Clear();

object ranobj = DBNull.Value;

//设置选择单元格,在复制出来。Excel转换成图片的操作方法。
wsheet.get_Range("A1", "D3").Copy(ranobj);

//全选单元格,全部复制出来。Excel转换成图片的操作方法。
//wsheet.UsedRange.Copy(objMis);
//Clipboard.SetDataObject(objMis);
IDataObject iData = Clipboard.GetDataObject();
Bitmap bits = (Bitmap)iData.GetData(DataFormats.Bitmap);
Bitmap myBitmap = new Bitmap(bits.Width, bits.Height);
Graphics g = Graphics.FromImage(myBitmap);
g.DrawImage(bits, 0, 0);
myBitmap.Save(string.Format(SAVEEXCELJPG, Guid.NewGuid()));

Clipboard.Clear();
myBitmap.Dispose();
bits.Dispose();
}

}
catch (Exception Excel)
{
throw Excel;
}
finally
{
singleExcel.Close(objMis, objMis, objMis);
app.Quit();
}
return string.Empty;
}

/// <summary>
/// 删除指定的临时文件。
/// </summary>
/// <param name="filePath"></param>
private static void DeleteTempFile(string filePath)
{
File.Delete(filePath);
}
}
}
ted8224 iT邦新手 5 級 ‧ 2018-05-23 16:23:39 檢舉
還是沒辦法....run下去 它沒反應
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
小魚
iT邦大師 1 級 ‧ 2018-05-23 20:11:19
最佳解答

好吧,
既然你誠心誠意的問了,
我就大發慈悲的告訴你,
大概改兩三個地方就可以了,
可以結合allenlwh貼出來的,
基本上功能差不多,
缺點就是一個工作表只印一頁...
這部分找時間再來想辦法吧...

public static string GetExcel(string filePath, string outPutPath)
{
    EXCEL.Application app = new Microsoft.Office.Interop.Excel.Application();
    object objMis = Type.Missing;
    EXCEL.Workbook singleExcel = app.Workbooks.Open(filePath, objMis, objMis, objMis, objMis, objMis, objMis, objMis, objMis, objMis, objMis, objMis, objMis, objMis, objMis);
    try
    {
        //wsheet.UsedRange.Select();
        for (int i = 1; i <= singleExcel.Worksheets.Count; i++)
        {
            EXCEL.Worksheet wsheet = (EXCEL.Worksheet)singleExcel.Worksheets[i];

            //Clipboard.Clear();

            object ranobj = DBNull.Value;

            //设置选择单元格,在复制出来。Excel转换成图片的操作方法。
            wsheet.get_Range("A1", "D3").Copy(ranobj);

            //全选单元格,全部复制出来。Excel转换成图片的操作方法。
            //wsheet.UsedRange.Copy(objMis);
            //Clipboard.SetDataObject(objMis);
            System.Windows.Forms.IDataObject iData = Clipboard.GetDataObject();
            Bitmap bits = (Bitmap)iData.GetData(DataFormats.Bitmap);
            Bitmap myBitmap = new Bitmap(bits.Width, bits.Height);
            Graphics g = Graphics.FromImage(myBitmap);
            g.DrawImage(bits, 0, 0);
            myBitmap.Save($"{outPutPath}test_{i}.jpg", ImageFormat.Jpeg);

            Clipboard.Clear();
            myBitmap.Dispose();
            bits.Dispose();
        }

    }
    catch (Exception Excel)
    {
        throw Excel;
    }
    finally
    {
        singleExcel.Close(objMis, objMis, objMis);
        app.Quit();
    }
    return "輸出成功!";
}

剛才那是Function,下面是使用方法

string result = GetExcel(@"D:\test.xls", @"D:\tmp\");
label1.Text = result;

另外,這種方式會開啟文件(只是沒讓你看到畫面),
所以要開.xls檔案就要安裝Office 2003左右版本,
要開.xlsx檔案就要安裝Office 2007之後的版本。

看更多先前的回應...收起先前的回應...
小魚 iT邦大師 1 級 ‧ 2018-05-23 20:14:06 檢舉
wsheet.get_Range("A1", "D3").Copy(ranobj);

這一行是設定列印範圍,
所以只有一小部分被印出來,
如果要印全部範圍就要改成

wsheet.UsedRange.Copy(objMis);

不過如果資料很多印出來字就會很小,
因為要把所有資料印在一頁...

小魚 iT邦大師 1 級 ‧ 2018-05-23 20:16:09 檢舉

不過只差這麼一點點,
你竟然沒辦法自己解決,
自己解決問題應該是程式設計師的基本功吧...

ted8224 iT邦新手 5 級 ‧ 2018-05-24 09:59:21 檢舉

小魚大大 謝謝你分享code,那我也分享我昨天 有突然試成功的code

static void Main(string[] args)
{
Workbook workbook = new Workbook();
workbook.LoadFromFile(@"D:\DocToImg\555.xlsx", ExcelVersion.Version97to2003);
Worksheet sheet = workbook.Worksheets[0];
sheet.SaveToImage("D:\DocToImg\555.png");

這個也能轉換檔案...成圖檔功能

但小弟還在思考 怎麼去調它的解析度

小魚 iT邦大師 1 級 ‧ 2018-05-24 22:05:04 檢舉

這個方法我倒是沒試成功,
你也是用 Microsoft.Office.Interop.Excel; 套件嗎?

ted8224 iT邦新手 5 級 ‧ 2018-05-25 08:59:56 檢舉

你再重新開一個專案,直接複製貼上code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Spire.Xls;
using System.Drawing.Imaging;
using System.Drawing;
using 自這
然後參考 Microsoft.Office.Interop.Excel; 我有加

小魚 iT邦大師 1 級 ‧ 2018-05-25 11:54:14 檢舉

Spire.Xls 這哪來的?

ted8224 iT邦新手 5 級 ‧ 2018-05-28 08:08:03 檢舉

加入參考..

ted8224 iT邦新手 5 級 ‧ 2018-05-28 08:54:02 檢舉
小魚 iT邦大師 1 級 ‧ 2018-05-28 11:50:09 檢舉

是可以用,
不過會有浮水印,
這應該也是一個要錢的套件...

1
allenlwh
iT邦高手 1 級 ‧ 2018-05-23 10:49:09

提供之前的做法(C# 2008),給你參考
1.設定excel輸出範圍

myRange = xlWorkSheet.get_Range("A1", "O19");

2.複製到剪貼簿

myRange.CopyPicture(Excel.XlPictureAppearance.xlScreen, Excel.XlCopyPictureFormat.xlBitmap);

3.將剪貼簿內的圖片存到物件內

Image image = (Image)data.GetData(DataFormats.Bitmap, true);
this.pictureBox1.Image = image;

4.存檔

image.Save(Exceljpg, System.Drawing.Imaging.ImageFormat.Jpeg);
小魚 iT邦大師 1 級 ‧ 2018-05-23 12:03:53 檢舉

試試看, 不過感覺你好像少寫了一些東西...

allenlwh iT邦高手 1 級 ‧ 2018-05-23 13:05:36 檢舉

很久以前的筆記,只寫了這些重點。/images/emoticon/emoticon16.gif

小魚 iT邦大師 1 級 ‧ 2018-05-23 20:00:28 檢舉

所以你最近沒有再練習過?
我還想問說要怎麼分頁呢,
這種方式看起來是一個工作表印一頁,
那如果我想要工作表內所有的內容分頁印出來,
不知道有沒有相關的方法呢?

我要發表回答

立即登入回答