图片
Facade API | 可付费升级 | 需要 Univer 服务端 | Univer on Node.js | Preset |
---|---|---|---|---|
✅ | - | - | - | UniverSheetsDrawingPreset |
插入浮动图片和单元格图片,支持调整大小和位置。
该功能包含以下插件包:
@univerjs/docs-drawing
- docs 插图插件@univerjs/drawing
- 基础插图插件@univerjs/drawing-ui
- 基础插图 UI 插件@univerjs/sheets-drawing
- sheet 插图插件@univerjs/sheets-drawing-ui
- sheet 插图 UI 插件
Presets 安装
import { createUniver, defaultTheme, LocaleType, merge } from '@univerjs/presets';
import { UniverSheetsCorePreset } from '@univerjs/presets/preset-sheets-core';
import UniverPresetSheetsCoreZhCN from '@univerjs/presets/preset-sheets-core/locales/zh-CN';
import { UniverSheetsDrawingPreset } from '@univerjs/presets/preset-sheets-drawing';
import UniverPresetSheetsDrawingZhCN from '@univerjs/presets/preset-sheets-drawing/locales/zh-CN';
import '@univerjs/presets/lib/styles/preset-sheets-core.css'
import '@univerjs/presets/lib/styles/preset-sheets-drawing.css'
const { univerAPI } = createUniver({
locale: LocaleType.ZH_CN,
locales: {
[LocaleType.ZH_CN]: merge(
{},
UniverPresetSheetsCoreZhCN,
UniverPresetSheetsDrawingZhCN
),
},
theme: defaultTheme,
presets: [
UniverSheetsCorePreset(),
UniverSheetsDrawingPreset()
]
});
手动组合安装
npm install @univerjs/docs-drawing @univerjs/drawing @univerjs/drawing-ui @univerjs/sheets-drawing @univerjs/sheets-drawing-ui
import { LocaleType, merge, Univer } from '@univerjs/core';
import { defaultTheme } from "@univerjs/design";
import { UniverDocsDrawingPlugin } from '@univerjs/docs-drawing';
import { IImageIoService, UniverDrawingPlugin } from '@univerjs/drawing';
import { UniverDrawingUIPlugin } from '@univerjs/drawing-ui';
import { UniverSheetsDrawingPlugin } from '@univerjs/sheets-drawing';
import { UniverSheetsDrawingUIPlugin } from '@univerjs/sheets-drawing-ui';
import DrawingUIZhCN from '@univerjs/drawing-ui/locale/zh-CN';
import SheetsDrawingUIZhCN from '@univerjs/sheets-drawing-ui/locale/zh-CN';
import '@univerjs/drawing-ui/lib/index.css';
import '@univerjs/sheets-drawing-ui/lib/index.css';
import '@univerjs/sheets-drawing-ui/facade';
const univer = new Univer({
theme: defaultTheme,
locale: LocaleType.ZH_CN,
locales: {
[LocaleType.ZH_CN]: merge(
DrawingUIZhCN,
SheetsDrawingUIZhCN,
),
},
});
// 当不使用协同插件时,注册代码如下:
univer.registerPlugin(UniverDrawingPlugin);
univer.registerPlugin(UniverDrawingUIPlugin);
univer.registerPlugin(UniverSheetsDrawingPlugin);
univer.registerPlugin(UniverSheetsDrawingUIPlugin);
// 使用协同插件时,需要提供 `override` 配置:
univer.registerPlugin(UniverDrawingPlugin, {
override: [[IImageIoService, null]], // 协同插件将会提供该实现
});
Facade API
完整 facade api 类型定义,请查看 FacadeAPI 。
添加浮动 DOM
FWorksheet.addFloatDomToPosition(layer)
方法可以添加一个浮动的 DOM 元素到指定位置。
const fWorksheet = univerAPI.getActiveWorkbook().getActiveSheet();
// 你应该在合适的时机注册组件(例如 Univer 加载完成时)
// 这是一个 React 组件。对于 Vue3 组件,第三个参数应该是 `{ framework: 'vue3' }`
univerAPI.registerComponent(
'myFloatDom',
({ data }) => (
<div style={{ width: '100%', height: '100%', background: '#fff', border: '1px solid #ccc', boxSizing: 'border-box' }}>
popup content:
{' '}
{data?.label}
</div>
)
);
// 添加浮动 DOM
// 如果 disposable 为 null,则浮动 DOM 添加失败
const disposeable = fWorksheet.addFloatDomToPosition({
componentKey: 'myFloatDom',
initPosition: {
startX: 100,
endX: 300,
startY: 100,
endY: 200,
},
// 组件数据
data: {
label: 'hahah',
}
});
// 2 秒后移除浮动 DOM
setTimeout(() => {
disposeable?.dispose();
}, 2000);
FWorksheet.addFloatDomToRange(range, layer, domLayout)
方法可以添加一个浮动的 DOM 元素到指定范围。
const fWorksheet = univerAPI.getActiveWorkbook().getActiveSheet();
// 注册一个范围加载组件
const RangeLoading = () => {
const divStyle = {
width: '100%',
height: '100%',
backgroundColor: '#fff',
border: '1px solid #ccc',
boxSizing: 'border-box' as const,
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
textAlign: 'center' as const,
transformOrigin: 'top left',
};
return (
<div style={divStyle}>
Loading...
</div>
);
};
univerAPI.registerComponent('RangeLoading', RangeLoading);
// 添加范围加载组件覆盖范围 A1:C3
const fRange = fWorksheet.getRange('A1:C3');
const disposeable = fWorksheet.addFloatDomToRange(fRange, { componentKey: 'RangeLoading' }, {}, 'myRangeLoading');
// 2 秒后移除浮动 DOM
setTimeout(() => {
disposeable?.dispose();
}, 2000);
// 另外一个示例 -------------------
// 注册一个浮动按钮组件
const FloatButton = () => {
const divStyle = {
width: '100px',
height: '30px',
backgroundColor: '#fff',
border: '1px solid #ccc',
boxSizing: 'border-box' as const,
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
textAlign: 'center' as const,
cursor: 'pointer',
};
const clickHandler = () => {
console.warn('click');
};
return (
<div style={divStyle} onClick={clickHandler}>
FloatButton
</div>
);
};
univerAPI.registerComponent('FloatButton', FloatButton);
// 添加浮动按钮到范围 A5:C7,位置从 A5 单元格开始,宽度为 100px,高度为 30px,边距为范围宽度和高度的 100%
const fRange2 = fWorksheet.getRange('A5:C7');
const disposeable2 = fWorksheet.addFloatDomToRange(
fRange2,
{
componentKey: 'FloatButton',
},
{
width: 100,
height: 30,
marginX: '100%', // 边距百分比到范围宽度,或像素
marginY: '100%'
},
'myFloatButton'
);
FWorksheet.addFloatDomToColumnHeader(column, layer, domPos)
方法可以添加一个浮动的 DOM 元素到指定列头。
const fWorksheet = univerAPI.getActiveWorkbook().getActiveSheet();
// 注册一个浮动按钮组件
const FloatButton = () => {
const divStyle = {
width: '100px',
height: '30px',
backgroundColor: '#fff',
border: '1px solid #ccc',
boxSizing: 'border-box' as const,
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
textAlign: 'center' as const,
cursor: 'pointer',
};
const clickHandler = () => {
console.warn('click');
};
return (
<div style={divStyle} onClick={clickHandler}>
FloatButton
</div>
);
};
univerAPI.registerComponent('FloatButton', FloatButton);
// 添加浮动按钮到列 D 头部,位置为右对齐,宽度为 100px,高度为 30px,边距为 0
const disposeable = fWorksheet.addFloatDomToColumnHeader(
3,
{
componentKey: 'FloatButton',
allowTransform: false,
},
{
width: 100,
height: 30,
marginX: 0,
marginY: 0,
horizonOffsetAlign: 'right',
},
'myFloatButton'
);
// 2 秒后移除浮动按钮
setTimeout(() => {
disposeable?.dispose();
}, 2000);
插入浮动图片
FWorksheet.newOverGridImage()
创建一个浮动图片构建器,返回一个 FOverGridImageBuilder
实例,可以通过链式调用生成 ISheetImage
对象用于插入浮动图片。
以下是 FOverGridImageBuilder
上的一些成员方法:
方法 | 描述 |
---|---|
buildAsync | 构建 ISheetImage 对象用于插入浮动图片 |
setSource | 设置 image 的来源 |
setColumn | 设置 image 的水平方向位置 |
setRow | 设置 image 的垂直方向位置 |
setColumnOffset | 设置 image 的水平方向偏移 |
setRowOffset | 设置 image 的垂直方向偏移 |
setWidth | 设置 image 的宽度 |
setHeight | 设置 image 的高度 |
setAnchorType | 设置 image 的锚点类型,是否随单元格位置和大小变化 |
setCropTop | 设置 image 的裁剪区域,定义顶部边缘,从而显示您想要的图像的特定部分 |
setCropLeft | 设置 image 的裁剪区域,定义左边缘,从而显示您想要的图像的特定部分 |
setCropBottom | 设置 image 的裁剪区域,定义底部边缘,从而显示您想要的图像的特定部分 |
setCropRight | 设置 image 的裁剪区域,定义右边缘,从而显示您想要的图像的特定部分 |
setRotate | 设置 image 的旋转角度 |
// 创建一个新的图片构建器并设置图片来源。
// 然后构建 `ISheetImage` 并插入到工作表中,位置从 F6 单元格开始,宽度为 500px,高度为 300px
const fWorkbook = univerAPI.getActiveWorkbook();
const fWorksheet = fWorkbook.getActiveSheet();
const image = await fWorksheet.newOverGridImage()
.setSource('https://avatars.githubusercontent.com/u/61444807?s=48&v=4', univerAPI.Enum.ImageSourceType.URL)
.setColumn(5)
.setRow(5)
.setWidth(500)
.setHeight(300)
.buildAsync();
fWorksheet.insertImages([image]);
亦可以通过 FWorksheet.insertImage(url, column, row, offsetX, offsetY)
方法插入图片。
// 插入一个图片到工作表,位置为 F6,偏移为 10px
const fWorksheet = univerAPI.getActiveWorkbook().getActiveSheet();
const result = await fWorksheet.insertImage('https://avatars.githubusercontent.com/u/61444807?s=48&v=4', 5, 5, 10, 10);
console.log(result);
获取浮动图片
FWorksheet.getImages()
方法可以获取工作表中的所有浮动图片,返回一个 FOverGridImage[]
实例数组。
const fWorksheet = univerAPI.getActiveWorkbook().getActiveSheet();
const images = fWorksheet.getImages();
images.forEach((image) => {
console.log(image, image.getId());
});
亦可以通过 FWorksheet.getImageById(id)
方法获取指定 id 的浮动图片。
更新浮动图片
FWorksheet.updateImages(sheetImages)
方法可以更新浮动图片的位置和大小等属性。
// 创建一个新的图片构建器并设置图片来源。
// 然后构建 `ISheetImage` 并插入到工作表中,位置从 F6 单元格开始,宽度为 500px,高度为 300px
const fWorkbook = univerAPI.getActiveWorkbook();
const fWorksheet = fWorkbook.getActiveSheet();
const image = await fWorksheet.newOverGridImage()
.setSource('https://avatars.githubusercontent.com/u/61444807?s=48&v=4', univerAPI.Enum.ImageSourceType.URL)
.setColumn(5)
.setRow(5)
.setWidth(500)
.setHeight(300)
.buildAsync();
fWorksheet.insertImages([image]);
// 4 秒后更新图片宽度为 100px,高度为 50px
setTimeout(async () => {
const imageBuilder = fWorksheet.getImageById(image.drawingId).toBuilder();
const newImage = await imageBuilder.setWidth(100).setHeight(50).buildAsync();
fWorksheet.updateImages([newImage]);
}, 4000);
删除浮动图片
FWorksheet.deleteImages(sheetImages)
方法可以删除浮动图片。
const fWorksheet = univerAPI.getActiveWorkbook().getActiveSheet();
const image = fWorksheet.getImages()[0];
// 删除工作表中的第一个图片
fWorksheet.deleteImages([image]);
插入单元格图片
FRange.insertCellImageAsync(file)
方法可以插入单元格图片。
const fWorkbook = univerAPI.getActiveWorkbook();
const fWorksheet = fWorkbook.getActiveSheet();
// 在 A10 单元格插入一个图片
const fRange = fWorksheet.getRange('A10');
const result = await fRange.insertCellImageAsync('https://avatars.githubusercontent.com/u/61444807?s=48&v=4');
console.log(result);