рдПрдХ рд╕рд╛рд▓ рдкрд╣рд▓реЗ, рд╣рдорд╛рд░реА рдХрдВрдкрдиреА рдХреЗ рдкрд╛рд╕ C # рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдерд╛, рдЬрд┐рд╕рдореЗрдВ Excel рд╕реЗ рдбреЗрдЯрд╛ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдРрдкреНрд▓реАрдХреЗрд╢рди рд╢рд╛рдорд┐рд▓ рдереА, рдЬрд┐рд╕рдореЗрдВ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдФрд░ рдбреНрд░реИрдЧ'рдПрдпрд░рдбреНрд░реЙрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рдерд╛ред рдмрдлрд╝рд░ рдкрд░ рдХреЙрдкреА рдХрд░рддреЗ рд╕рдордп, рдПрдХреНрд╕реЗрд▓ рд╡рд╣рд╛рдБ рдХрдИ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ рдбрд╛рд▓рддрд╛ рд╣реИред рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдорд╛рдирдХ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ CF_TEXT, CF_CSV, рдЖрджрд┐ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рдЖрдкрдХреЛ рдорд░реНрдЬ рдХрд┐рдП рдЧрдП рд╕реЗрд▓ рдФрд░ рдЕрдиреНрдп рдЦреБрд╢рд┐рдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рд╕реАрдзреЗ рд░реЗрдВрдЬ рдСрдмреНрдЬреЗрдХреНрдЯ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЬрд┐рд╕реЗ рдЦреАрдВрдЪ рдпрд╛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, CF_LINKSOURCE рдкреНрд░рд╛рд░реВрдк рдФрд░ рдЗрд╕рдореЗрдВ рдирд┐рд╣рд┐рдд IMoniker рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝реЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░реЗрдВред
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдХрд╛рд╢реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░рд┐рдпреЛрдВ рдХреА рдХрд╣рд╛рдиреА рдореЗрдВ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ:
рд░реЗрдВрдЬ IMoniker ,
IMtiker in
IStream ,
IStream in
IDataObject , рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдореЗрдВ
IDataObject рдореЗрдВ
рдирд┐рд╣рд┐рдд рд╣реИред рдпрд╣ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рд╣реИ рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рд╕реЗ рдХреЙрд▓ рдХреА рдЧрдИ рд╡рд┐рдзрд┐ рдХреА рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
public static Range GetRange ()
{
IDataObject dataObject = System.Windows.Forms.Clipboard . GetDataObject () as IDataObject ;
IStream iStream = IStreamFromDataObject (dataObject);
IMoniker compositeMoniker = IMonikerFromIStream (iStream);
return RangeFromCompositeMoniker (compositeMoniker);
}
рдХреЗрд╡рд▓ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рд╣реИ: рд╣рдореЗрдВ
System.Windows рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
Forms.IDataObject рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
GetDataObject (), рдФрд░
System.Runtime.InteropServices.ComTypes.IDataObject ред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХрд▓рд╛рдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
IDataObject рд╕реЗ
IStream рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рднреА рдЖрд╕рд╛рди рд╣реИред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдПрдХреНрд╕реЗрд▓ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рд░рдЦреЗ рдЧрдП рджрд░реНрдЬрдиреЛрдВ рд╕реНрд╡рд░реВрдкреЛрдВ рдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЗ рдмреАрдЪ, рд╣рдореЗрдВ CF_LINKSOURCE рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
private const string CF_LINKSOURCE_ID = "Link Source" ;
private static IStream IStreamFromDataObject ( IDataObject dataObject)
{
STGMEDIUM medium;
FORMATETC formatEtc = new FORMATETC ();
formatEtc. cfFormat = ( short ) System.Windows.Forms.DataFormats . GetFormat ( CF_LINKSOURCE_ID ). Id ;
formatEtc. dwAspect = DVASPECT . DVASPECT_CONTENT ;
formatEtc. lindex = - 1 ;
formatEtc. ptd = new IntPtr ( 0 );
formatEtc. tymed = TYMED . TYMED_ISTREAM ;
dataObject. GetData ( ref formatEtc, out medium);
return Marshal . GetObjectForIUnknown (medium. unionmember ) as IStream ;
}
рддреЛ,
IStream рдорд┐рд▓ рдЧрдпрд╛ред рдЕрдм рдЖрдкрдХреЛ
рдЗрд╕рдореЗрдВ рд╕реЗ
IMoniker рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдкрд╣рд▓реА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреА рдЦреЛрдЬ рдХреА рдЧрдИ рдереА:
IStream рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдиреНрдпрдерд╛,
OleLoadFromStream STG_E_READFAULT рд╡рд╛рдкрд╕ рдЖ
рдЬрд╛рдПрдЧрд╛ ред рд╡реИрд╕реЗ,
OleLoadFromStream рдХреЛ ole32.dll рд╕реЗ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
Pinvoke.net рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдЧрд╛ред рд╣рдорд╛рд░реЗ рдХреЛрдб рдореЗрдВ рдПрдХрдорд╛рддреНрд░ рдЪреАрдЬ int рд╕реЗ
HRESULT рдореЗрдВ рд▓реМрдЯрд╛рдП рдЧрдП рдкрд░рд┐рдгрд╛рдо рдХреА рдЬрдЧрд╣ рд▓реЗ рд░рд╣реА рд╣реИ, рд╡рд╣рд╛рдВ рд╡рд░реНрдгрд┐рдд рд╣реИред
private static IMoniker IMonikerFromIStream ( IStream iStream)
{
iStream. Seek ( 0 , 0 , IntPtr . Zero );
Guid guid = Marshal . GenerateGuidForType ( typeof ( stdole . IUnknown ));
object obj;
if ( ole32 . OleLoadFromStream (iStream, ref guid, out obj))
return obj as IMoniker ;
else
return null ;
}
IMoniker рд╣реИ ! рдЖрдЧреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ, рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред рд╣рдо ole32.dll рд╕реЗ
BindMoniker рдлрд╝рдВрдХреНрд╢рди рдХреЛ
рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ , рдЬрд┐рд╕рдореЗрдВ рд╣рдо
рд╢реНрд░реЗрдгреА рд╡рд░реНрдЧ
IMoniker рдФрд░
рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЖрдЙрдЯрдкреБрдЯ
рд░реЗрдВрдЬ рд╣реИ ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╣рдореЗрдВ
MK_E_NOOBJECT рддреНрд░реБрдЯрд┐
рдорд┐рд▓рддреА рд╣реИред рдпрд╣рд╛рдБ рдмрд┐рдВрджреБ рд╣реИред рдХрдИ рддрд░рд╣ рдХреЗ рдореЙрдирд┐рдХрд░реНрд╕ рд╣реИрдВ: рдлрд╛рдЗрд▓ рдореЙрдиреАрдХрд░, рдЖрдЗрдЯрдо рдореЙрдиреАрдХрд░, рдХрдореНрдкреЛрдЬрд┐рдЯ рдореЙрдиреАрдХрд░, рдЖрджрд┐ред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рд╕реЗ рд╣рдореЗрдВ рдХрдореНрдкреЛрдЬрд┐рдЯ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдореЛрдирд┐рдХрд░ рдорд┐рд▓рддрд╛ рд╣реИред рдЬреЛ рдЕрдиреНрдп рджреЛ рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИ - рдлрд╛рдЗрд▓ рдФрд░ рдЖрдЗрдЯрдоред рдкрд╣рд▓рд╛
рдХрд╛рд░реНрдпрдкреБрд╕реНрддрд┐рдХрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛
рдХрд╛рд░реНрдпрдкреБрд╕реНрддрд┐рдХрд╛ рдХреЗ рдЕрдВрджрд░
рд╢реНрд░реЗрдгреА рдХреЗ рд▓рд┐рдПред рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХреНрд╕реЗрд▓ рдХрдореНрдкрд╛рдЙрдВрдб рдореЛрдирд┐рдХрд░ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред рд▓реЗрдХрд┐рди рдЬреБрджрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - рдирд╣реАрдВред рдЦреИрд░, рдЖрдкрдХреЛ рдЙрд╕рдХреА рдорджрдж рдХрд░рдиреА рд╣реЛрдЧреАред
private static Range RangeFromCompositeMoniker ( IMoniker compositeMoniker)
{
List < IMoniker > monikers = SplitCompositeMoniker (compositeMoniker);
if (monikers. Count != 2 )
throw new ApplicationException ( "Invalid moniker" );
IBindCtx bindctx;
if (! ole32 . CreateBindCtx ( 0 , out bindctx) || bindctx == null )
throw new ApplicationException ( "Can't create bindctx" );
object obj;
Guid workbookGuid = Marshal . GenerateGuidForType ( typeof ( Workbook ));
monikers[ 0 ]. BindToObject (bindctx, null , ref workbookGuid, out obj);
Workbook workbook = obj as Workbook ;
ExcelItemMonikerHelper helper = new ExcelItemMonikerHelper (monikers[ 1 ], bindctx);
return helper. GetRange (workbook);
}
private static List < IMoniker > SplitCompositeMoniker ( IMoniker compositeMoniker)
{
List < IMoniker > monikerList = new List < IMoniker >();
IEnumMoniker enumMoniker;
compositeMoniker. Enum ( true , out enumMoniker);
if (enumMoniker != null )
{
IMoniker [] monikerArray = new IMoniker [ 1 ];
IntPtr fetched = new IntPtr ();
HRESULT res;
while (res = enumMoniker. Next ( 1 , monikerArray, fetched))
{
monikerList. Add (monikerArray[ 0 ]);
}
return monikerList;
}
else
throw new ApplicationException ( "IMoniker is not composite" );
}
SplitCompositeMoniker рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ
рд╣реБрдП, рд╣рдо рдХрдореНрдкреЛрдЬрд╝рд┐рдЯ рдореЙрдиреАрдХрд░ рдХреЛ рдлрд╛рдЗрд▓ рдореЙрдиреАрдХрд░ рдФрд░ рдЖрдЗрдЯрдо рдореЙрдиреАрдХрд░ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдо рдмрд╕ рдлрд╛рдЗрд▓
рдореЙрдиреАрдЯрд░ рдкрд░
BindToObject рдХрд╣рддреЗ рд╣реИрдВ рдФрд░
рд╡рд░реНрдХрдмреБрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдлрд┐рд░ рд╣рдо рдПрдХреНрд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрдЗрдЯрдо рдореЙрдиреАрдХрд░ рджреНрд╡рд╛рд░рд╛
рд░реЗрдВрдЬ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдордиреЗ рдПрдХ рд╕рд╣рд╛рдпрдХ рд▓рд┐рдЦрд╛ред рдореИрдВ рд▓реЗрдЦ рдореЗрдВ рдХреЛрдб рдирд╣реАрдВ рджреВрдВрдЧрд╛, рдЖрдк рдЗрд╕реЗ рдбреЗрдореЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрд╣ moniker рдХреА DisplayName рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИ, рд╢реАрдЯ рдХрд╛ рдирд╛рдо рдФрд░ рдЪрдпрдирд┐рдд рдХреНрд╖реЗрддреНрд░ рдХреА рд╕реАрдорд╛рдУрдВ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ, рдФрд░ рдорд╛рдирдХ
Microsoft.Office.Interop.Express рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
рдХрд╛рд░реНрдпрдкреБрд╕реНрддрд┐рдХрд╛ рд╕реЗ рд╡рд╛рдВрдЫрд┐рдд
рд╕реАрдорд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред
рдпрд╣рд╛рдВ рдкрд░ рдкрд░реА рдХрдерд╛ рд╕рдорд╛рдкреНрдд рд╣реЛрддреА рд╣реИред рдФрд░ рдЬрд┐рд╕рдиреЗ рд╕реБрдирд╛ - рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд┐рдпрд╛ рдФрд░ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдХрд┐рд╕реА рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ рдЬреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдореЙрдиреАрдХрд░ рдбрд╛рд▓рддрд╛ рд╣реИред
рдбреЗрдореЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ
рдпрд╣рд╛рдВ рд╣реИ ред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рд▓рд┐рдВрдХ рдПрдХ рдХреЛрдб рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рдореИрдВрдиреЗ рд▓реЗрдЦ рдХреЛ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ =) рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реИ рдХрд┐ рд╕рд░реНрджрд┐рдпреЛрдВ рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рд▓реЗрдЦ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдХрд░реНрдо рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдирд╣реАрдВ рднреВрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд╕реЗ рд╡рд╣рд╛рдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!