Tôi muốn chuyển đổi tệp excel thành hình ảnh (mọi định dạng đều ok) theo lập trình (C#). Hiện tại tôi đang sử dụng Thư viện Microsoft Interop & Office 2007, nhưng nó không hỗ trợ lưu vào hình ảnh theo mặc định.Lập trình (C#) chuyển đổi Excel sang hình ảnh
Vì vậy, công việc xung quanh hiện tại của tôi là như sau:
- mở file Excel sử dụng Microsoft Interop;
- Tìm hiểu phạm vi tối đa (có chứa dữ liệu);
- Sử dụng CopyPicture() trên phạm vi đó, sẽ sao chép dữ liệu vào Clipboard.
Bây giờ là phần khó khăn (và các vấn đề của tôi):
Vấn đề 1:
Sử dụng lớp .NET Clipboard, tôi không thể nhận được các dữ liệu chính xác sao chép từ clipboard : dữ liệu giống nhau, nhưng bằng cách nào đó định dạng bị bóp méo (phông chữ của toàn bộ tài liệu dường như trở nên đậm và khó đọc hơn một chút trong khi chúng không được); Nếu tôi dán từ clipboard bằng mspaint.exe, hình ảnh được dán là chính xác (và giống như tôi muốn nó).
Tôi đã tháo rời mspaint.exe và tìm thấy một chức năng mà nó đang sử dụng (OleGetClipboard) để lấy dữ liệu từ clipboard, nhưng tôi dường như không làm cho nó hoạt động trong C#/.NET.
Những thứ khác tôi đã thử là Clipboard WINAPI (OpenClipboard, GetClipboardData, CF_ENHMETAFILE), nhưng kết quả giống như sử dụng phiên bản .NET.
Vấn đề 2:
Sử dụng phạm vi và CopyPicture, nếu có bất kỳ hình ảnh trong bảng excel, những hình ảnh không được sao chép cùng với các dữ liệu xung quanh vào clipboard.
Một số mã nguồn
Excel.Application app = new Excel.Application();
app.Visible = app.ScreenUpdating = app.DisplayAlerts = false;
app.CopyObjectsWithCells = true;
app.CutCopyMode = Excel.XlCutCopyMode.xlCopy;
app.DisplayClipboardWindow = false;
try {
Excel.Workbooks workbooks = null;
Excel.Workbook book = null;
Excel.Sheets sheets = null;
try {
workbooks = app.Workbooks;
book = workbooks.Open(inputFile, false, false, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing);
sheets = book.Worksheets;
} catch {
Cleanup(workbooks, book, sheets); //Cleanup function calls Marshal.ReleaseComObject for all passed objects
throw;
}
for (int i = 0; i < sheets.Count; i++) {
Excel.Worksheet sheet = (Excel.Worksheet)sheets.get_Item(i + 1);
Excel.Range myrange = sheet.UsedRange;
Excel.Range rowRange = myrange.Rows;
Excel.Range colRange = myrange.Columns;
int rows = rowRange.Count;
int cols = colRange.Count;
//Following is used to find range with data
string startRange = "A1";
string endRange = ExcelColumnFromNumber(cols) + rows.ToString();
//Skip "empty" excel sheets
if (startRange == endRange) {
Excel.Range firstRange = sheet.get_Range(startRange, endRange);
Excel.Range cellRange = firstRange.Cells;
object text = cellRange.Text;
string strText = text.ToString();
string trimmed = strText.Trim();
if (trimmed == "") {
Cleanup(trimmed, strText, text, cellRange, firstRange, myrange, rowRange, colRange, sheet);
continue;
}
Cleanup(trimmed, strText, text, cellRange, firstRange);
}
Excel.Range range = sheet.get_Range(startRange, endRange);
try {
range.CopyPicture(Excel.XlPictureAppearance.xlScreen, Excel.XlCopyPictureFormat.xlPicture);
//Problem here <-------------
//Every attempt to get data from Clipboard fails
} finally {
Cleanup(range);
Cleanup(myrange, rowRange, colRange, sheet);
}
} //end for loop
book.Close(false, Type.Missing, Type.Missing);
workbooks.Close();
Cleanup(book, sheets, workbooks);
} finally {
app.Quit();
Cleanup(app);
GC.Collect();
}
Bắt dữ liệu từ clipboard sử dụng WINAPI thành công, nhưng với chất lượng xấu. Nguồn:
protected virtual void ClipboardToPNG(string filename) {
if (OpenClipboard(IntPtr.Zero)) {
if (IsClipboardFormatAvailable((int)CLIPFORMAT.CF_ENHMETAFILE)) {
int hEmfClp = GetClipboardDataA((int)CLIPFORMAT.CF_ENHMETAFILE);
if (hEmfClp != 0) {
int hEmfCopy = CopyEnhMetaFileA(hEmfClp, null);
if (hEmfCopy != 0) {
Metafile metafile = new Metafile(new IntPtr(hEmfCopy), true);
metafile.Save(filename, ImageFormat.Png);
}
}
}
CloseClipboard();
}
}
Bất kỳ ai có giải pháp? (Tôi đang sử dụng .NET 2.0 btw)
Bạn có thể chia sẻ mã nguồn của mình không? Bạn muốn lấy dữ liệu đã sao chép ở định dạng nào? Như bitmap? –