`
haifengwuch
  • 浏览: 4937 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

world,excel 浏览器中浏览

    博客分类:
  • java
阅读更多
    项目中需要world,excel在浏览器中查看,浏览,试用了很多中方法,测试发现用world,excel转换成html浏览器中就可以查看了,world由于文档里面可能包含图片。需要注意点,通过测试效果还不错,代码贴出来被后期查阅。
1. world to html


import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.apache.commons.io.FileUtils;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.converter.PicturesManager;
import org.apache.poi.hwpf.converter.WordToHtmlConverter;
import org.apache.poi.hwpf.usermodel.Picture;
import org.apache.poi.hwpf.usermodel.PictureType;
import org.apache.poi.xwpf.converter.core.BasicURIResolver;
import org.apache.poi.xwpf.converter.core.FileImageExtractor;
import org.apache.poi.xwpf.converter.xhtml.XHTMLConverter;
import org.apache.poi.xwpf.converter.xhtml.XHTMLOptions;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.w3c.dom.Document;

public class Word2Html {
public static void main(String[] args) throws Throwable {
//PoiWord07ToHtml();
PoiWord03ToHtml("d:\\", "d:\\用户手册-用户端.doc", "d:\\w.html");
}

/**
* @param path 文件图片临时目录
* @param file 原始文件
* @param outPath 输出文件
*/
public static boolean toHtml(String path, String file, String outPath) {
boolean bl = false;
try {
if (file.endsWith(".doc")) {
PoiWord03ToHtml(path, file, outPath);
}
if (file.endsWith(".docx")) {
PoiWord07ToHtml(path, file, outPath);
}
bl = true;
} catch (Exception e) {
e.printStackTrace();
}
return bl;
}

/**
* word07版本(.docx)转html
* poi:word07在线预览
*/
public static void PoiWord07ToHtml(String path, String file, String outPath) throws IOException {
File f = new File(file);
if (!f.exists()) {
System.out.println("Sorry File does not Exists!");
} else {
if (f.getName().endsWith(".docx") || f.getName().endsWith(".DOCX")) {
//读取文档内容   
InputStream in = new FileInputStream(f);
XWPFDocument document = new XWPFDocument(in);

File imageFolderFile = new File(path);
//加载html页面时图片路径 
XHTMLOptions options = XHTMLOptions.create().URIResolver(new BasicURIResolver("/temp/"));
//图片保存文件夹路径 
options.setExtractor(new FileImageExtractor(imageFolderFile));
OutputStream out = new FileOutputStream(new File(outPath));
XHTMLConverter.getInstance().convert(document, out, options);
out.close();
} else {
System.out.println("Enter only MS Office 2007+ files");
}
}
System.out.println("ok!");
}

public static void PoiWord03ToHtml(String path, String file, String outPath) throws IOException, ParserConfigurationException, TransformerException {
InputStream input = new FileInputStream(file);
HWPFDocument wordDocument = new HWPFDocument(input);
WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument());
wordToHtmlConverter.setPicturesManager(new PicturesManager() {
public String savePicture(byte[] content, PictureType pictureType, String suggestedName, float widthInches, float heightInches) {     //图片在html页面加载路径 
return "/temp/" + suggestedName;
}
});
wordToHtmlConverter.processDocument(wordDocument);
//获取文档中所有图片 
List pics = wordDocument.getPicturesTable().getAllPictures();
if (pics != null) {
for (int i = 0; i < pics.size(); i++) {
Picture pic = (Picture) pics.get(i);
try {//图片保存在文件夹的路径 
pic.writeImageContent(new FileOutputStream(path + pic.suggestFullFileName()));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
//创建html页面并将文档中内容写入页面 
Document htmlDocument = wordToHtmlConverter.getDocument();
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
DOMSource domSource = new DOMSource(htmlDocument);
StreamResult streamResult = new StreamResult(outStream);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer serializer = tf.newTransformer();
serializer.setOutputProperty(OutputKeys.ENCODING, "utf-8");
serializer.setOutputProperty(OutputKeys.INDENT, "yes");
serializer.setOutputProperty(OutputKeys.METHOD, "html");
serializer.transform(domSource, streamResult);
outStream.close();
String content = new String(outStream.toString("UTF-8"));
FileUtils.writeStringToFile(new File(outPath), content, "utf-8");
System.out.println("ok!");
}
}



2. excel to html

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.io.FileUtils;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFPalette;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFColor;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**
* @功能描述 POI 读取 Excel 转 HTML 支持 03xls 和 07xlsx 版本 包含样式
* @author Devil
* @创建时间 2015/4/19 21:34
*/
public class POIReadExcelToHtml {

/**
* 测试
* @param args
*/
public static void main(String[] args) {

excelToHtml("d:\\test.xlsx", "d:\\test6.html");

}

/**
* 转换excel变成html
* @param filePath
* @param outPdfPath
*/
public static boolean excelToHtml(String filePath, String outPdfPath) {
InputStream is = null;
String htmlExcel = "";
boolean bl = false;
htmlExcel = excelToHtmlString(filePath);
try {
htmlExcel = new String(htmlExcel.getBytes(), "utf-8");
FileUtils.writeStringToFile(new File(outPdfPath), htmlExcel, "utf-8");
bl = true;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return bl;
}

/**
* 获取文件内容
* @param filePath
* @return
*/
public static String excelToHtmlString(String filePath) {
InputStream is = null;
String htmlExcel = "";
try {
File sourcefile = new File(filePath);
is = new FileInputStream(sourcefile);
Workbook wb = WorkbookFactory.create(is);//此WorkbookFactory在POI-3.10版本中使用需要添加dom4j
if (wb instanceof XSSFWorkbook) {
XSSFWorkbook xWb = (XSSFWorkbook) wb;
htmlExcel = POIReadExcelToHtml.getExcelInfo(xWb, true);
} else if (wb instanceof HSSFWorkbook) {
HSSFWorkbook hWb = (HSSFWorkbook) wb;
htmlExcel = POIReadExcelToHtml.getExcelInfo(hWb, true);
}

} catch (Exception e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return htmlExcel;
}

public static String excelToHtmlString(InputStream is) {
String htmlExcel = "";
try {

Workbook wb = WorkbookFactory.create(is);//此WorkbookFactory在POI-3.10版本中使用需要添加dom4j
if (wb instanceof XSSFWorkbook) {
XSSFWorkbook xWb = (XSSFWorkbook) wb;
htmlExcel = POIReadExcelToHtml.getExcelInfo(xWb, true);
} else if (wb instanceof HSSFWorkbook) {
HSSFWorkbook hWb = (HSSFWorkbook) wb;
htmlExcel = POIReadExcelToHtml.getExcelInfo(hWb, true);
}

} catch (Exception e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return htmlExcel;
}

public static String getExcelInfo(Workbook wb, boolean isWithStyle) {
StringBuffer sb = new StringBuffer();
int num = wb.getNumberOfSheets();
//添加头
sb.append("<!doctype html>");
sb.append("<html>");
sb.append("<head>");
sb.append("<meta charset='utf-8' />");
sb.append("</head>");
sb.append("<body>");
for (int i = 0; i < num; i++) {
sb.append(getSheetInfo(wb, wb.getSheetAt(i), isWithStyle));
sb.append("<br><br>");
}
sb.append("</body>");
sb.append("</html>");
return sb.toString();

}

public static String getSheetInfo(Workbook wb, Sheet sheet, boolean isWithStyle) {
StringBuffer sb = new StringBuffer();
//Sheet sheet = wb.getSheetAt(0);//获取第一个Sheet的内容
int lastRowNum = sheet.getLastRowNum();
Map<String, String> map[] = getRowSpanColSpanMap(sheet);
sb.append("<table style='border-collapse:collapse;' width='100%'>");
Row row = null;        //兼容
Cell cell = null;    //兼容

for (int rowNum = sheet.getFirstRowNum(); rowNum <= lastRowNum; rowNum++) {
row = sheet.getRow(rowNum);
if (row == null) {
sb.append("<tr><td > &nbsp;</td></tr>");
continue;
}
sb.append("<tr>");
int lastColNum = row.getLastCellNum();
for (int colNum = 0; colNum < lastColNum; colNum++) {
cell = row.getCell(colNum);
if (cell == null) {    //特殊情况 空白的单元格会返回null
sb.append("<td>&nbsp;</td>");
continue;
}

String stringValue = getCellValue(cell);
if (map[0].containsKey(rowNum + "," + colNum)) {
String pointString = map[0].get(rowNum + "," + colNum);
map[0].remove(rowNum + "," + colNum);
int bottomeRow = Integer.valueOf(pointString.split(",")[0]);
int bottomeCol = Integer.valueOf(pointString.split(",")[1]);
int rowSpan = bottomeRow - rowNum + 1;
int colSpan = bottomeCol - colNum + 1;
sb.append("<td rowspan= '" + rowSpan + "' colspan= '" + colSpan + "' ");
} else if (map[1].containsKey(rowNum + "," + colNum)) {
map[1].remove(rowNum + "," + colNum);
continue;
} else {
sb.append("<td ");
}

//判断是否需要样式
if (isWithStyle) {
dealExcelStyle(wb, sheet, cell, sb);//处理单元格样式
}

sb.append(">");
if (stringValue == null || "".equals(stringValue.trim())) {
sb.append(" &nbsp; ");
} else {
// 将ascii码为160的空格转换为html下的空格(&nbsp;)
sb.append(stringValue.replace(String.valueOf((char) 160), "&nbsp;"));
}
sb.append("</td>");
}
sb.append("</tr>");
}

sb.append("</table>");
return sb.toString();
}

private static Map<String, String>[] getRowSpanColSpanMap(Sheet sheet) {

Map<String, String> map0 = new HashMap<String, String>();
Map<String, String> map1 = new HashMap<String, String>();
int mergedNum = sheet.getNumMergedRegions();
CellRangeAddress range = null;
for (int i = 0; i < mergedNum; i++) {
range = sheet.getMergedRegion(i);
int topRow = range.getFirstRow();
int topCol = range.getFirstColumn();
int bottomRow = range.getLastRow();
int bottomCol = range.getLastColumn();
map0.put(topRow + "," + topCol, bottomRow + "," + bottomCol);
// System.out.println(topRow + "," + topCol + "," + bottomRow + "," + bottomCol);
int tempRow = topRow;
while (tempRow <= bottomRow) {
int tempCol = topCol;
while (tempCol <= bottomCol) {
map1.put(tempRow + "," + tempCol, "");
tempCol++;
}
tempRow++;
}
map1.remove(topRow + "," + topCol);
}
Map[] map = { map0, map1 };
return map;
}

/**
* 获取表格单元格Cell内容
* @param cell
* @return
*/
private static String getCellValue(Cell cell) {

String result = new String();
switch (cell.getCellType()) {
case Cell.CELL_TYPE_NUMERIC:// 数字类型 
if (HSSFDateUtil.isCellDateFormatted(cell)) {// 处理日期格式、时间格式 
SimpleDateFormat sdf = null;
if (cell.getCellStyle().getDataFormat() == HSSFDataFormat.getBuiltinFormat("h:mm")) {
sdf = new SimpleDateFormat("HH:mm");
} else {// 日期 
sdf = new SimpleDateFormat("yyyy-MM-dd");
}
Date date = cell.getDateCellValue();
result = sdf.format(date);
} else if (cell.getCellStyle().getDataFormat() == 58) {
// 处理自定义日期格式:m月d日(通过判断单元格的格式id解决,id的值是58) 
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
double value = cell.getNumericCellValue();
Date date = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(value);
result = sdf.format(date);
} else {
double value = cell.getNumericCellValue();
CellStyle style = cell.getCellStyle();
DecimalFormat format = new DecimalFormat();
String temp = style.getDataFormatString();
// 单元格设置成常规 
if (temp.equals("General")) {
format.applyPattern("#");
}
result = format.format(value);
}
break;
case Cell.CELL_TYPE_STRING:// String类型 
result = cell.getRichStringCellValue().toString();
break;
case Cell.CELL_TYPE_BLANK:
result = "";
break;
default:
result = "";
break;
}
return result;
}

/**
* 处理表格样式
* @param wb
* @param sheet
* @param cell
* @param sb
*/
private static void dealExcelStyle(Workbook wb, Sheet sheet, Cell cell, StringBuffer sb) {

CellStyle cellStyle = cell.getCellStyle();
if (cellStyle != null) {
short alignment = cellStyle.getAlignment();
sb.append("align='" + convertAlignToHtml(alignment) + "' ");//单元格内容的水平对齐方式
short verticalAlignment = cellStyle.getVerticalAlignment();
sb.append("valign='" + convertVerticalAlignToHtml(verticalAlignment) + "' ");//单元格中内容的垂直排列方式

if (wb instanceof XSSFWorkbook) {

XSSFFont xf = ((XSSFCellStyle) cellStyle).getFont();
short boldWeight = xf.getBoldweight();
sb.append("style='");
sb.append("font-weight:" + boldWeight + ";"); // 字体加粗
sb.append("font-size: " + xf.getFontHeight() / 2 + "%;"); // 字体大小
int columnWidth = sheet.getColumnWidth(cell.getColumnIndex());
sb.append("width:" + columnWidth + "px;");

XSSFColor xc = xf.getXSSFColor();
if (xc != null && !"".equals(xc)) {
sb.append("color:#" + xc.getARGBHex().substring(2) + ";"); // 字体颜色
}

XSSFColor bgColor = (XSSFColor) cellStyle.getFillForegroundColorColor();
//System.out.println("************************************");
//System.out.println("BackgroundColorColor: "+cellStyle.getFillBackgroundColorColor());
//System.out.println("ForegroundColor: "+cellStyle.getFillForegroundColor());//0
//System.out.println("BackgroundColorColor: "+cellStyle.getFillBackgroundColorColor());
//System.out.println("ForegroundColorColor: "+cellStyle.getFillForegroundColorColor());
//String bgColorStr = bgColor.getARGBHex();
//System.out.println("bgColorStr: "+bgColorStr);
if (bgColor != null && !"".equals(bgColor)) {
sb.append("background-color:#" + bgColor.getARGBHex().substring(2) + ";"); // 背景颜色
}
sb.append(getBorderStyle(0, cellStyle.getBorderTop(), ((XSSFCellStyle) cellStyle).getTopBorderXSSFColor()));
sb.append(getBorderStyle(1, cellStyle.getBorderRight(), ((XSSFCellStyle) cellStyle).getRightBorderXSSFColor()));
sb.append(getBorderStyle(2, cellStyle.getBorderBottom(), ((XSSFCellStyle) cellStyle).getBottomBorderXSSFColor()));
sb.append(getBorderStyle(3, cellStyle.getBorderLeft(), ((XSSFCellStyle) cellStyle).getLeftBorderXSSFColor()));

} else if (wb instanceof HSSFWorkbook) {

HSSFFont hf = ((HSSFCellStyle) cellStyle).getFont(wb);
short boldWeight = hf.getBoldweight();
short fontColor = hf.getColor();
sb.append("style='");
HSSFPalette palette = ((HSSFWorkbook) wb).getCustomPalette(); // 类HSSFPalette用于求的颜色的国际标准形式
HSSFColor hc = palette.getColor(fontColor);
sb.append("font-weight:" + boldWeight + ";"); // 字体加粗
sb.append("font-size: " + hf.getFontHeight() / 2 + "%;"); // 字体大小
String fontColorStr = convertToStardColor(hc);
if (fontColorStr != null && !"".equals(fontColorStr.trim())) {
sb.append("color:" + fontColorStr + ";"); // 字体颜色
}
int columnWidth = sheet.getColumnWidth(cell.getColumnIndex());
sb.append("width:" + columnWidth + "px;");
short bgColor = cellStyle.getFillForegroundColor();
hc = palette.getColor(bgColor);
String bgColorStr = convertToStardColor(hc);
if (bgColorStr != null && !"".equals(bgColorStr.trim())) {
sb.append("background-color:" + bgColorStr + ";"); // 背景颜色
}
sb.append(getBorderStyle(palette, 0, cellStyle.getBorderTop(), cellStyle.getTopBorderColor()));
sb.append(getBorderStyle(palette, 1, cellStyle.getBorderRight(), cellStyle.getRightBorderColor()));
sb.append(getBorderStyle(palette, 3, cellStyle.getBorderLeft(), cellStyle.getLeftBorderColor()));
sb.append(getBorderStyle(palette, 2, cellStyle.getBorderBottom(), cellStyle.getBottomBorderColor()));
}

sb.append("' ");
}
}

/**
* 单元格内容的水平对齐方式
* @param alignment
* @return
*/
private static String convertAlignToHtml(short alignment) {

String align = "left";
switch (alignment) {
case CellStyle.ALIGN_LEFT:
align = "left";
break;
case CellStyle.ALIGN_CENTER:
align = "center";
break;
case CellStyle.ALIGN_RIGHT:
align = "right";
break;
default:
break;
}
return align;
}

/**
* 单元格中内容的垂直排列方式
* @param verticalAlignment
* @return
*/
private static String convertVerticalAlignToHtml(short verticalAlignment) {

String valign = "middle";
switch (verticalAlignment) {
case CellStyle.VERTICAL_BOTTOM:
valign = "bottom";
break;
case CellStyle.VERTICAL_CENTER:
valign = "center";
break;
case CellStyle.VERTICAL_TOP:
valign = "top";
break;
default:
break;
}
return valign;
}

private static String convertToStardColor(HSSFColor hc) {

StringBuffer sb = new StringBuffer("");
if (hc != null) {
if (HSSFColor.AUTOMATIC.index == hc.getIndex()) {
return null;
}
sb.append("#");
for (int i = 0; i < hc.getTriplet().length; i++) {
sb.append(fillWithZero(Integer.toHexString(hc.getTriplet()[i])));
}
}

return sb.toString();
}

private static String fillWithZero(String str) {
if (str != null && str.length() < 2) {
return "0" + str;
}
return str;
}

static String[] bordesr = { "border-top:", "border-right:", "border-bottom:", "border-left:" };
static String[] borderStyles = { "solid ", "solid ", "solid ", "solid ", "solid ", "solid ", "solid ", "solid ", "solid ", "solid", "solid", "solid", "solid", "solid" };

private static String getBorderStyle(HSSFPalette palette, int b, short s, short t) {

if (s == 0)
return bordesr[b] + borderStyles[s] + "#d0d7e5 1px;";
;
String borderColorStr = convertToStardColor(palette.getColor(t));
borderColorStr = borderColorStr == null || borderColorStr.length() < 1 ? "#000000" : borderColorStr;
return bordesr[b] + borderStyles[s] + borderColorStr + " 1px;";

}

private static String getBorderStyle(int b, short s, XSSFColor xc) {

if (s == 0)
return bordesr[b] + borderStyles[s] + "#d0d7e5 1px;";
;
if (xc != null && !"".equals(xc)) {
String borderColorStr = xc.getARGBHex();//t.getARGBHex();
borderColorStr = borderColorStr == null || borderColorStr.length() < 1 ? "#000000" : borderColorStr.substring(2);
return bordesr[b] + borderStyles[s] + borderColorStr + " 1px;";
}

return "";
}

}

分享到:
评论

相关推荐

    Google浏览器office插件

    该插件是一款可以帮助用户查看和编辑微软Office Word、Excel和PPT的google官方插件,用户在Chrome中安装了Google文档、表格及幻灯片插件以后,就可以在本地计算机中没有安装Microsoft Office软件的情况下,在浏览器...

    Spring boot 在线预览办公文件(doc、docx、xls等)

    Spring boot 在线预览办公文件(doc、docx、xls、xlsx、pdf等),转化效果个人觉得比较理想

    ASP.NET3.5典型模块开发源代码

    24.1.3 使用Web Service实现Hello World 327 24.2 使用Web Service实现天气预报 329 24.2.1 创建Web Service天气服务 329 24.2.2 在程序中使用Web Service 330 24.3 小结 332 第25章 在线随机考试模块 ...

    vc++ 应用源码包_1

    在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自绘对话框。 vc编程:自动停靠窗体,吸附窗体 OnMoving事件处理。 vc基于HTTP协议断点续传和多线程下载源代码 VC满屏开满玫瑰花 VC然输入框出现气球提示 调用...

    vc++ 应用源码包_2

    在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自绘对话框。 vc编程:自动停靠窗体,吸附窗体 OnMoving事件处理。 vc基于HTTP协议断点续传和多线程下载源代码 VC满屏开满玫瑰花 VC然输入框出现气球提示 调用...

    vc++ 应用源码包_6

    独立打包,保证可解压,内含大量源码,网上搜集...在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自绘对话框。 vc编程:自动停靠窗体,吸附窗体 OnMoving事件处理。 vc基于HTTP协议断点续传和多线程下载源代码 VC...

    vc++ 应用源码包_5

    独立打包,保证可解压,内含大量源码,网上搜集...在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自绘对话框。 vc编程:自动停靠窗体,吸附窗体 OnMoving事件处理。 vc基于HTTP协议断点续传和多线程下载源代码 VC...

    vc++ 应用源码包_3

    在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自绘对话框。 vc编程:自动停靠窗体,吸附窗体 OnMoving事件处理。 vc基于HTTP协议断点续传和多线程下载源代码 VC满屏开满玫瑰花 VC然输入框...

    网管教程 从入门到精通软件篇.txt

    DTA:World Bank(世界银行)的STARS数据文件 DTD:SGML文档类型定义(DTD)文件 DTED:地面高度数字数据(图形的数据格式)文件 DTF:Symantec Q&A相关的数据库数据文件 DTM:DigiTrakker模块文件 DUN:...

    vc++ 开发实例源码包

    Excel文件的导入和导出操作 如题。主要的实现在CMyExcel类中。 expclass_src dll库的演示。 fge.1.1.alpha.sdk 精灵系统,一套MFC渲染引擎,含2D/3D等渲染,效果看源码,IFEngine是整个引擎接口,IFSystem是硬件...

Global site tag (gtag.js) - Google Analytics