Chcę konwertować plik excel na obraz (każdy format jest ok) programowo (C#). Obecnie używam bibliotek Microsoft Interop & Office 2007, ale domyślnie nie obsługuje on zapisywania obrazu.Programowo (C#) przekonwertować Excel do obrazu
Więc moja obecna praca wokół jest następująca:
- Otwórz plik programu Excel przy użyciu programu Microsoft Interop;
- Znajdź maksymalny zakres (zawierający dane);
- Użyj CopyPicture() w tym zakresie, który skopiuje dane do Schowka.
Teraz część trudne (i moje problemy):
Problem 1:
Korzystanie z klasy .NET schowku, nie jestem w stanie uzyskać dokładne dane skopiowane ze schowka : dane są takie same, ale w jakiś sposób formatowanie jest zniekształcone (czcionka całego dokumentu wydaje się być odważna i nieco bardziej nieczytelna, podczas gdy nie były); Jeśli wkleję ze schowka za pomocą programu mspaint.exe, wklejony obraz jest poprawny (i dokładnie tak, jak powinienem być).
Zdemontowałem mspaint.exe i znalazłem funkcję, z której korzysta (OleGetClipboard), aby pobrać dane ze schowka, ale nie mogę sprawić, żeby działało w C#/.NET.
Inne rzeczy, których próbowałem, to schowek WINAPI (OpenClipboard, GetClipboardData, CF_ENHMETAFILE), ale wyniki były takie same, jak przy użyciu wersji .NET.
Problem 2:
Korzystanie zakres i CopyPicture, czy są jakieś obrazy w arkuszu Excel, te obrazy nie są kopiowane wraz z otaczającymi danych do schowka.
Niektóre kodu źródłowego
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();
}
Pobieranie danych ze schowka wykorzystaniem WinAPI powiedzie, ale ze złej jakości. Źródło:
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();
}
}
Ktoś ma rozwiązanie? (Używam .NET 2.0 btw)
mógłbyś udostępnić kod źródłowy? W jakim formacie chcesz uzyskać skopiowane dane? W bitmapie? –